Skip to content

Commit

Permalink
Introduce kryo-macros converter
Browse files Browse the repository at this point in the history
  • Loading branch information
dkomanov committed Aug 4, 2019
1 parent 13485b8 commit e6f4702
Show file tree
Hide file tree
Showing 6 changed files with 145 additions and 10 deletions.
34 changes: 24 additions & 10 deletions WORKSPACE
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
workspace(name = "stuff")

scala_version = "2.12"

scala_full_version = "%s.8" % scala_version

rules_scala_version = "acac888c86e79110d1d08ab5578a7d0101c97963"

rules_jvm_external_tag = "2.5"

rules_jvm_external_sha = "249e8129914be6d987ca57754516be35a14ea866c616041ff0cd32ea94d2f3a1"
protobuf_version="09745575a923640154bcf307fba8aedff47f240a"
protobuf_version_sha256="416212e14481cff8fd4849b1c1c1200a7f34808a54377e22d7447efdf54ad758"

protobuf_version = "09745575a923640154bcf307fba8aedff47f240a"

protobuf_version_sha256 = "416212e14481cff8fd4849b1c1c1200a7f34808a54377e22d7447efdf54ad758"

skylib_version = "0.9.0"

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
Expand All @@ -28,21 +35,22 @@ http_archive(

http_archive(
name = "com_google_protobuf",
url = "https://github.com/protocolbuffers/protobuf/archive/%s.tar.gz" % protobuf_version,
strip_prefix = "protobuf-%s" % protobuf_version,
sha256 = protobuf_version_sha256,
strip_prefix = "protobuf-%s" % protobuf_version,
url = "https://github.com/protocolbuffers/protobuf/archive/%s.tar.gz" % protobuf_version,
)

http_archive(
name = "bazel_skylib",
type = "tar.gz",
url = "https://github.com/bazelbuild/bazel-skylib/releases/download/{}/bazel_skylib-{}.tar.gz".format (skylib_version, skylib_version),
sha256 = "1dde365491125a3db70731e25658dfdd3bc5dbdfd11b840b3e987ecf043c7ca0",
type = "tar.gz",
url = "https://github.com/bazelbuild/bazel-skylib/releases/download/{}/bazel_skylib-{}.tar.gz".format(skylib_version, skylib_version),
)

register_toolchains("//tools:default_scala_toolchain")

load("@io_bazel_rules_scala//scala:scala.bzl", "scala_repositories")

scala_repositories((
scala_full_version,
{
Expand All @@ -53,18 +61,23 @@ scala_repositories((
))

load("@io_bazel_rules_scala//specs2:specs2_junit.bzl", "specs2_junit_repositories")

specs2_junit_repositories(scala_version = scala_full_version)

load("@io_bazel_rules_scala//jmh:jmh.bzl", "jmh_repositories")

jmh_repositories()

load("@io_bazel_rules_scala//scala_proto:scala_proto.bzl", "scala_proto_repositories")

scala_proto_repositories(scala_version = scala_full_version)

load("@io_bazel_rules_scala//scala_proto:toolchains.bzl", "scala_proto_register_toolchains")

scala_proto_register_toolchains()

load("@io_bazel_rules_scala//twitter_scrooge:twitter_scrooge.bzl", "twitter_scrooge")

twitter_scrooge(scala_version = scala_full_version)

load("@rules_jvm_external//:defs.bzl", "maven_install")
Expand All @@ -76,8 +89,8 @@ maven_install(
"org.specs2:specs2-mock_%s:4.6.0" % scala_version,
"org.slf4j:slf4j-api:1.7.25",
],
repositories = maven_repositories,
fetch_sources = True,
repositories = maven_repositories,
)

maven_install(
Expand All @@ -88,8 +101,8 @@ maven_install(
"mysql:mysql-connector-java:6.0.6",
"com.wix:wix-embedded-mysql:4.2.0",
],
repositories = maven_repositories,
fetch_sources = True,
repositories = maven_repositories,
)

maven_install(
Expand All @@ -111,7 +124,8 @@ maven_install(
"com.github.plokhotnyuk.jsoniter-scala:jsoniter-scala-macros_%s:0.52.2" % scala_version,
"com.google.protobuf:protobuf-java:3.9.0",
"javax.annotation:javax.annotation-api:1.3.2",
"com.evolutiongaming:kryo-macros_%s:1.1.0" % scala_version,
],
repositories = maven_repositories,
fetch_sources = False,
fetch_sources = True,
repositories = maven_repositories + ["https://dl.bintray.com/evolutiongaming/maven/"],
)
12 changes: 12 additions & 0 deletions src/com/komanov/serialization/converters/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ all_converters = [
":java_thrift",
":jackson",
":jsoniter_scala",
":kryo_macros",
":scala_pb",
":scrooge",
]
Expand Down Expand Up @@ -128,6 +129,17 @@ scala_macro_library(
],
)

scala_library(
name = "kryo_macros",
srcs = ["KryoMacrosConverter.scala"],
deps = [
"//src/com/komanov/serialization/converters/api",
"@scala_serialization_maven//:com_esotericsoftware_kryo",
"@scala_serialization_maven//:com_evolutiongaming_kryo_macros_2_12",
"@scala_serialization_maven//:joda_time_joda_time",
],
)

scala_library(
name = "scrooge",
srcs = ["ScroogeConverter.scala"],
Expand Down
1 change: 1 addition & 0 deletions src/com/komanov/serialization/converters/Converters.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ object Converters {
"Serializable" -> JavaSerializationConverter,
"BooPickle" -> BoopickleConverter,
"Chill" -> ChillConverter,
"KryoMacros" -> KryoMacrosConverter,
"Jsoniter" -> JsoniterScalaConverter,
"Circe" -> CirceConverter
)
Expand Down
104 changes: 104 additions & 0 deletions src/com/komanov/serialization/converters/KryoMacrosConverter.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package com.komanov.serialization.converters

import java.util.UUID

import com.esotericsoftware.kryo.io.{FastInput, FastOutput, Input, Output}
import com.esotericsoftware.kryo.{Kryo, Serializer => EsotericSerializer}
import com.komanov.serialization.converters.api.MyConverter
import com.komanov.serialization.domain._

/** https://github.com/evolution-gaming/kryo-macros */
object KryoMacrosConverter extends MyConverter {

import Implicits._

private val pool = new ThreadLocal[KryoMacrosConverter] {
override def initialValue(): KryoMacrosConverter =
KryoMacrosConverter(new Kryo, new FastInput(), new FastOutput(131072, 131072))
}

def toByteArray(site: Site): Array[Byte] = pool.get().write(site)

def fromByteArray(bytes: Array[Byte]): Site = pool.get().read[Site](bytes)

def toByteArray(event: SiteEvent): Array[Byte] = pool.get().write(event)

def siteEventFromByteArray(clazz: Class[_], bytes: Array[Byte]): SiteEvent = pool.get().read[SiteEvent](bytes)

private case class KryoMacrosConverter(kryo: Kryo, in: FastInput, out: FastOutput) {
def read[A <: AnyRef](bs: Array[Byte])(implicit s: EsotericSerializer[A], m: Manifest[A]): A = {
in.setBuffer(bs)
kryo.readObject(in, m.runtimeClass.asInstanceOf[Class[A]], s)
}

def write[A <: AnyRef](a: A)(implicit s: EsotericSerializer[A]): Array[Byte] = {
out.clear()
kryo.writeObject(out, a, s)
out.toBytes
}
}

private object Implicits {

import com.evolutiongaming.kryo.Serializer

implicit val uuidSerializer: EsotericSerializer[UUID] = new EsotericSerializer[UUID] {
override def write(kryo: Kryo, output: Output, t: UUID): Unit = {
output.writeLong(t.getMostSignificantBits)
output.writeLong(t.getLeastSignificantBits)
}
override def read(kryo: Kryo, input: Input, aClass: Class[UUID]): UUID = {
new UUID(input.readLong(), input.readLong())
}
}

implicit val domainSerializer: EsotericSerializer[Domain] = Serializer.make[Domain]
implicit val metaTagSerializer: EsotericSerializer[MetaTag] = Serializer.make[MetaTag]
implicit val entryPointSerializer: EsotericSerializer[EntryPoint] = Serializer.makeCommon[EntryPoint] {
case 0 => Serializer.inner[DomainEntryPoint]
case 1 => Serializer.inner[FreeEntryPoint]
}
implicit val pageComponentDataSerializer: EsotericSerializer[PageComponentData] = Serializer.makeCommon[PageComponentData] {
case 0 => Serializer.inner[TextComponentData]
case 1 => Serializer.inner[ButtonComponentData]
case 2 => Serializer.inner[BlogComponentData]
}
implicit val pageComponentPositionSerializer: EsotericSerializer[PageComponentPosition] = Serializer.make[PageComponentPosition]
implicit val pageComponentSerializer: EsotericSerializer[PageComponent] = Serializer.make[PageComponent]
implicit val pageSerializer: EsotericSerializer[Page] = Serializer.make[Page]

implicit val siteSerializer: EsotericSerializer[Site] = Serializer.make[Site]

implicit val siteEventSerializer: EsotericSerializer[SiteEvent] = Serializer.makeCommon[SiteEvent] {
case 0 => Serializer.inner[SiteCreated]
case 1 => Serializer.inner[SiteNameSet]
case 2 => Serializer.inner[SiteDescriptionSet]
case 3 => Serializer.inner[SiteRevisionSet]
case 4 => Serializer.inner[SitePublished]
case 5 => Serializer.inner[SiteUnpublished]
case 6 => Serializer.inner[SiteFlagAdded]
case 7 => Serializer.inner[SiteFlagRemoved]
case 8 => Serializer.inner[DomainAdded]
case 9 => Serializer.inner[DomainRemoved]
case 10 => Serializer.inner[PrimaryDomainSet]
case 11 => Serializer.inner[DefaultMetaTagAdded]
case 12 => Serializer.inner[DefaultMetaTagRemoved]
case 13 => Serializer.inner[PageAdded]
case 14 => Serializer.inner[PageRemoved]
case 15 => Serializer.inner[PageNameSet]
case 16 => Serializer.inner[PageMetaTagAdded]
case 17 => Serializer.inner[PageMetaTagRemoved]
case 18 => Serializer.inner[PageComponentAdded]
case 19 => Serializer.inner[PageComponentRemoved]
case 20 => Serializer.inner[PageComponentPositionSet]
case 21 => Serializer.inner[PageComponentPositionReset]
case 22 => Serializer.inner[TextComponentDataSet]
case 23 => Serializer.inner[ButtonComponentDataSet]
case 24 => Serializer.inner[BlogComponentDataSet]
case 25 => Serializer.inner[DomainEntryPointAdded]
case 26 => Serializer.inner[FreeEntryPointAdded]
case 27 => Serializer.inner[EntryPointRemoved]
case 28 => Serializer.inner[PrimaryEntryPointSet]
}
}
}
1 change: 1 addition & 0 deletions src/com/komanov/serialization/jmh/ConverterType.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public enum ConverterType {
SERIALIZABLE(JavaSerializationConverter$.MODULE$),
BOOPICKLE(BoopickleConverter$.MODULE$),
CHILL(ChillConverter$.MODULE$),
KRYO_MACROS(KryoMacrosConverter$.MODULE$),
JSONITER(JsoniterScalaConverter$.MODULE$),
CIRCE(CirceConverter$.MODULE$),
/**/;
Expand Down
3 changes: 3 additions & 0 deletions tools/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ scala_toolchain(
#"-Ywarn-unused",
"-deprecation",
"-explaintypes",
#"-Xmacro-settings:print-serializers", //to log sources of serializaer which are generated by kryo-macros
#"-Xmacro-settings:print-codecs", //to log sources of codecs which are generated by jsoniter-scala

],
visibility = ["//visibility:public"],
)
Expand Down

0 comments on commit e6f4702

Please sign in to comment.