Enable Jackson for 2.13 (#27136)

* Enable jackson for 2.13

* Fix 2.13 warnings in jackson module
This commit is contained in:
Christopher Batey 2019-06-13 16:17:04 +01:00 committed by GitHub
parent 893bd8b74b
commit 6e93bef605
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 30 deletions

View file

@ -157,10 +157,10 @@ class JacksonSerializationBench {
private def serializeDeserialize[T <: AnyRef](msg: T): T = { private def serializeDeserialize[T <: AnyRef](msg: T): T = {
serialization.findSerializerFor(msg) match { serialization.findSerializerFor(msg) match {
case serializer: SerializerWithStringManifest case serializer: SerializerWithStringManifest =>
val blob = serializer.toBinary(msg) val blob = serializer.toBinary(msg)
serializer.fromBinary(blob, serializer.manifest(msg)).asInstanceOf[T] serializer.fromBinary(blob, serializer.manifest(msg)).asInstanceOf[T]
case serializer case serializer =>
val blob = serializer.toBinary(msg) val blob = serializer.toBinary(msg)
if (serializer.includeManifest) if (serializer.includeManifest)
serializer.fromBinary(blob, Some(msg.getClass)).asInstanceOf[T] serializer.fromBinary(blob, Some(msg.getClass)).asInstanceOf[T]

View file

@ -65,7 +65,8 @@ object JacksonObjectMapperProvider extends ExtensionId[JacksonObjectMapperProvid
config: Config, config: Config,
dynamicAccess: DynamicAccess, dynamicAccess: DynamicAccess,
log: Option[LoggingAdapter]) = { log: Option[LoggingAdapter]) = {
import scala.collection.JavaConverters._
import akka.util.ccompat.JavaConverters._
val mapper = objectMapperFactory.newObjectMapper(bindingName, jsonFactory) val mapper = objectMapperFactory.newObjectMapper(bindingName, jsonFactory)
@ -96,11 +97,11 @@ object JacksonObjectMapperProvider extends ExtensionId[JacksonObjectMapperProvid
if (configuredModules.contains("*")) if (configuredModules.contains("*"))
ObjectMapper.findModules(dynamicAccess.classLoader).asScala ObjectMapper.findModules(dynamicAccess.classLoader).asScala
else else
configuredModules.flatMap { fqcn configuredModules.flatMap { fqcn =>
if (isModuleEnabled(fqcn, dynamicAccess)) { if (isModuleEnabled(fqcn, dynamicAccess)) {
dynamicAccess.createInstanceFor[Module](fqcn, Nil) match { dynamicAccess.createInstanceFor[Module](fqcn, Nil) match {
case Success(m) Some(m) case Success(m) => Some(m)
case Failure(e) case Failure(e) =>
log.foreach( log.foreach(
_.error( _.error(
e, e,
@ -113,7 +114,7 @@ object JacksonObjectMapperProvider extends ExtensionId[JacksonObjectMapperProvid
None None
} }
val modules2 = modules1.map { module val modules2 = modules1.map { module =>
if (module.isInstanceOf[ParameterNamesModule]) if (module.isInstanceOf[ParameterNamesModule])
// ParameterNamesModule needs a special case for the constructor to ensure that single-parameter // ParameterNamesModule needs a special case for the constructor to ensure that single-parameter
// constructors are handled the same way as constructors with multiple parameters. // constructors are handled the same way as constructors with multiple parameters.
@ -146,7 +147,7 @@ object JacksonObjectMapperProvider extends ExtensionId[JacksonObjectMapperProvid
} }
private def features(config: Config, section: String): immutable.Seq[(String, Boolean)] = { private def features(config: Config, section: String): immutable.Seq[(String, Boolean)] = {
import scala.collection.JavaConverters._ import akka.util.ccompat.JavaConverters._
val cfg = config.getConfig(section) val cfg = config.getConfig(section)
cfg.root.keySet().asScala.map(key => key -> cfg.getBoolean(key)).toList cfg.root.keySet().asScala.map(key => key -> cfg.getBoolean(key)).toList
} }

View file

@ -150,16 +150,16 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory
} }
} }
private val migrations: Map[String, JacksonMigration] = { private val migrations: Map[String, JacksonMigration] = {
import scala.collection.JavaConverters._ import akka.util.ccompat.JavaConverters._
conf.getConfig("migrations").root.unwrapped.asScala.toMap.map { conf.getConfig("migrations").root.unwrapped.asScala.toMap.map {
case (k, v) case (k, v) =>
val transformer = system.dynamicAccess.createInstanceFor[JacksonMigration](v.toString, Nil).get val transformer = system.dynamicAccess.createInstanceFor[JacksonMigration](v.toString, Nil).get
k -> transformer k -> transformer
} }
} }
private val blacklist: GadgetClassBlacklist = new GadgetClassBlacklist private val blacklist: GadgetClassBlacklist = new GadgetClassBlacklist
private val whitelistClassPrefix = { private val whitelistClassPrefix = {
import scala.collection.JavaConverters._ import akka.util.ccompat.JavaConverters._
conf.getStringList("whitelist-class-prefix").asScala.toVector conf.getStringList("whitelist-class-prefix").asScala.toVector
} }
@ -177,8 +177,8 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory
checkAllowedClassName(className) checkAllowedClassName(className)
checkAllowedClass(obj.getClass) checkAllowedClass(obj.getClass)
migrations.get(className) match { migrations.get(className) match {
case Some(transformer) className + "#" + transformer.currentVersion case Some(transformer) => className + "#" + transformer.currentVersion
case None className case None => className
} }
} }
@ -221,20 +221,20 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory
val migration = migrations.get(manifestClassName) val migration = migrations.get(manifestClassName)
val className = migration match { val className = migration match {
case Some(transformer) if fromVersion < transformer.currentVersion case Some(transformer) if fromVersion < transformer.currentVersion =>
transformer.transformClassName(fromVersion, manifestClassName) transformer.transformClassName(fromVersion, manifestClassName)
case Some(transformer) if fromVersion > transformer.currentVersion case Some(transformer) if fromVersion > transformer.currentVersion =>
throw new IllegalStateException( throw new IllegalStateException(
s"Migration version ${transformer.currentVersion} is " + s"Migration version ${transformer.currentVersion} is " +
s"behind version $fromVersion of deserialized type [$manifestClassName]") s"behind version $fromVersion of deserialized type [$manifestClassName]")
case _ manifestClassName case _ => manifestClassName
} }
if (className ne manifestClassName) if (className ne manifestClassName)
checkAllowedClassName(className) checkAllowedClassName(className)
val clazz = system.dynamicAccess.getClassFor[AnyRef](className) match { val clazz = system.dynamicAccess.getClassFor[AnyRef](className) match {
case Success(c) c case Success(c) => c
case Failure(_) case Failure(_) =>
throw new NotSerializableException( throw new NotSerializableException(
s"Cannot find manifest class [$className] for serializer [${getClass.getName}].") s"Cannot find manifest class [$className] for serializer [${getClass.getName}].")
} }
@ -243,11 +243,11 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory
val decompressBytes = if (compressed) decompress(bytes) else bytes val decompressBytes = if (compressed) decompress(bytes) else bytes
val result = migration match { val result = migration match {
case Some(transformer) if fromVersion < transformer.currentVersion case Some(transformer) if fromVersion < transformer.currentVersion =>
val jsonTree = objectMapper.readTree(decompressBytes) val jsonTree = objectMapper.readTree(decompressBytes)
val newJsonTree = transformer.transform(fromVersion, jsonTree) val newJsonTree = transformer.transform(fromVersion, jsonTree)
objectMapper.treeToValue(newJsonTree, clazz) objectMapper.treeToValue(newJsonTree, clazz)
case _ case _ =>
objectMapper.readValue(decompressBytes, clazz) objectMapper.readValue(decompressBytes, clazz)
} }
@ -386,8 +386,8 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory
val buffer = new Array[Byte](BufferSize) val buffer = new Array[Byte](BufferSize)
@tailrec def readChunk(): Unit = in.read(buffer) match { @tailrec def readChunk(): Unit = in.read(buffer) match {
case -1 () case -1 => ()
case n case n =>
out.write(buffer, 0, n) out.write(buffer, 0, n)
readChunk() readChunk()
} }

View file

@ -369,8 +369,8 @@ abstract class JacksonSerializerSpec(serializerName: String)
def serializerFor(obj: AnyRef, sys: ActorSystem = system): JacksonSerializer = def serializerFor(obj: AnyRef, sys: ActorSystem = system): JacksonSerializer =
serialization(sys).findSerializerFor(obj) match { serialization(sys).findSerializerFor(obj) match {
case serializer: JacksonSerializer serializer case serializer: JacksonSerializer => serializer
case s case s =>
throw new IllegalStateException(s"Wrong serializer ${s.getClass} for ${obj.getClass}") throw new IllegalStateException(s"Wrong serializer ${s.getClass} for ${obj.getClass}")
} }

View file

@ -42,6 +42,8 @@ lazy val aggregatedProjects: Seq[ProjectReference] = List[ProjectReference](
actorTestkitTyped, actorTestkitTyped,
actorTyped, actorTyped,
actorTypedTests, actorTypedTests,
benchJmh,
benchJmhTyped,
cluster, cluster,
clusterMetrics, clusterMetrics,
clusterSharding, clusterSharding,
@ -52,6 +54,7 @@ lazy val aggregatedProjects: Seq[ProjectReference] = List[ProjectReference](
discovery, discovery,
distributedData, distributedData,
docs, docs,
jackson,
multiNodeTestkit, multiNodeTestkit,
osgi, osgi,
persistence, persistence,
@ -68,10 +71,7 @@ lazy val aggregatedProjects: Seq[ProjectReference] = List[ProjectReference](
streamTests, streamTests,
streamTestsTck, streamTestsTck,
streamTyped, streamTyped,
testkit) ++ testkit)
(if (isScala213) List.empty[ProjectReference]
else
List[ProjectReference](jackson, benchJmh, benchJmhTyped)) // FIXME #27019 remove 2.13 condition when Jackson ScalaModule has been released for Scala 2.13
lazy val root = Project(id = "akka", base = file(".")) lazy val root = Project(id = "akka", base = file("."))
.aggregate(aggregatedProjects: _*) .aggregate(aggregatedProjects: _*)
@ -247,8 +247,6 @@ lazy val jackson = akkaModule("akka-serialization-jackson")
.settings(AutomaticModuleName.settings("akka.serialization.jackson")) .settings(AutomaticModuleName.settings("akka.serialization.jackson"))
.settings(OSGi.jackson) .settings(OSGi.jackson)
.settings(javacOptions += "-parameters") .settings(javacOptions += "-parameters")
// FIXME #27019 remove when Jackson ScalaModule has been released for Scala 2.13
.settings(crossScalaVersions -= Dependencies.scala213Version)
.enablePlugins(ScaladocNoVerificationOfDiagrams) .enablePlugins(ScaladocNoVerificationOfDiagrams)
.disablePlugins(MimaPlugin) .disablePlugins(MimaPlugin)