Skip to content

Commit 597dcd3

Browse files
Replace json4s with com.lihaoyi.upickle / ujson (#6331)
Also bumped cpg to get rid of all json4s artifacts in the whole dependency tree. For: https://harness.atlassian.net/browse/QT-1539
1 parent ab7271b commit 597dcd3

26 files changed

Lines changed: 422 additions & 478 deletions

File tree

‎MODULE.bazel‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module(name = "joern")
33
bazel_dep(name = "rules_scala", version = "7.2.5")
44
bazel_dep(name = "codepropertygraph")
55

6-
CODEPROPERTYGRAPH_VERSION = "9d4b36e50cbffefcf9730e3afa9d4522e4f19e7c"
6+
CODEPROPERTYGRAPH_VERSION = "1735c289d7258d4ef02f6c39ce635581cca4f330"
77

88
BAZEL_TOOLING_VERSION = "fbdfc66995360c408ecf94d34837a0355aa7ac4d"
99

@@ -49,9 +49,8 @@ maven.install(
4949
"org.projectlombok:lombok:1.18.42",
5050
"net.lingala.zip4j:zip4j:2.11.5",
5151
"org.gradle:gradle-tooling-api:8.3",
52-
"com.lihaoyi:ujson_3:4.0.2",
53-
"com.lihaoyi:upickle_3:4.0.2",
54-
"org.json4s:json4s-native_3:4.0.7",
52+
"com.lihaoyi:ujson_3:4.4.3",
53+
"com.lihaoyi:upickle_3:4.4.3",
5554
"com.michaelpollmeier:scala-repl-pp_3.3.6:0.6.3",
5655
"commons-io:commons-io:2.22.0",
5756
"org.apache.commons:commons-lang3:3.14.0",

‎bazel/reexports/BUILD‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@ scala_library(
1616
name = "com_lihaoyi_upickle_with_deps",
1717
visibility = ["//visibility:public"],
1818
exports = [
19+
"@maven//:com_lihaoyi_geny_3",
1920
"@maven//:com_lihaoyi_ujson_3",
2021
"@maven//:com_lihaoyi_upickle_3",
22+
"@maven//:com_lihaoyi_upickle_core_3",
23+
"@maven//:com_lihaoyi_upickle_implicits_3",
2124
],
2225
deps = [
2326
],

‎build.sbt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name := "joern"
22
ThisBuild / organization := "io.joern"
33
ThisBuild / scalaVersion := "3.8.3"
44

5-
val cpgVersion = "1.7.77"
5+
val cpgVersion = "1.7.78"
66

77
lazy val joerncli = Projects.joerncli
88
lazy val querydb = Projects.querydb

‎console/build.sbt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ libraryDependencies ++= Seq(
1818
"org.zeroturnaround" % "zt-zip" % Versions.zeroTurnaround,
1919
"com.lihaoyi" %% "os-lib" % Versions.osLib,
2020
"com.lihaoyi" %% "pprint" % Versions.pPrint,
21+
"com.lihaoyi" %% "upickle" % Versions.upickle,
2122
"com.lihaoyi" %% "cask" % Versions.cask,
2223
"org.apache.commons" % "commons-lang3" % Versions.commonsLang,
2324
"org.scalatest" %% "scalatest" % Versions.scalatest % Test

‎console/src/main/scala/io/joern/console/workspacehandling/Project.scala‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ object Project {
1414

1515
case class ProjectFile(inputPath: String, name: String)
1616

17+
object ProjectFile {
18+
implicit val readWriter: upickle.default.ReadWriter[ProjectFile] = upickle.default.macroRW
19+
}
20+
1721
/** @param path
1822
* absolute path to directory holding the project
1923
* @param cpg

‎console/src/main/scala/io/joern/console/workspacehandling/WorkspaceManager.scala‎

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import io.shiftleft.semanticcpg.utils.FileUtil.*
77
import io.shiftleft.codepropertygraph.generated.Cpg
88
import io.shiftleft.codepropertygraph.cpgloading.CpgLoader
99
import io.shiftleft.semanticcpg.utils.FileUtil
10-
import org.json4s.DefaultFormats
11-
import org.json4s.native.Serialization.write as jsonWrite
1210

1311
import java.net.URLEncoder
1412
import java.nio.charset.Charset
@@ -86,16 +84,10 @@ class WorkspaceManager[ProjectType <: Project](path: String, loader: WorkspaceLo
8684

8785
/** Write the project's `project.json`, a JSON file that holds meta information.
8886
*/
89-
private def writeProjectFile(projectFile: ProjectFile, dirPath: Path): Path = {
90-
// TODO proguard and json4s don't play along. We actually want to
91-
// serialize the case class ProjectFile here, but it comes out
92-
// empty. This code will be moved to `codepropertgraph` at
93-
// which point serialization should work.
94-
// val content = jsonWrite(projectFile)
95-
implicit val formats: DefaultFormats.type = DefaultFormats
96-
val PROJECTFILE_NAME = "project.json"
97-
val content = jsonWrite(Map("inputPath" -> projectFile.inputPath, "name" -> projectFile.name))
98-
val projectPath = dirPath.resolve(PROJECTFILE_NAME)
87+
private[workspacehandling] def writeProjectFile(projectFile: ProjectFile, dirPath: Path): Path = {
88+
val PROJECTFILE_NAME = "project.json"
89+
val content = upickle.default.write(projectFile)
90+
val projectPath = dirPath.resolve(PROJECTFILE_NAME)
9991
Files.writeString(projectPath, content)
10092
projectPath
10193
}

‎console/src/test/scala/io/joern/console/workspacehandling/WorkspaceLoaderTests.scala‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ class WorkspaceLoaderTests extends AnyWordSpec with Matchers {
6060

6161
"ProjectFile" should {
6262

63-
import org.json4s.DefaultFormats
64-
import org.json4s.native.Serialization.{read => jsonRead, write => jsonWrite}
65-
implicit val formats: DefaultFormats.type = DefaultFormats
66-
6763
"be serializable to json" in {
68-
jsonWrite(ProjectFile("foo", "aname")) shouldBe """{"inputPath":"foo","name":"aname"}"""
64+
FileUtil.usingTemporaryDirectory(tmpDirPrefix) { tmpDir =>
65+
val manager = new WorkspaceManager(tmpDir.toString)
66+
val projectPath = manager.writeProjectFile(ProjectFile("foo", "aname"), tmpDir)
67+
Files.readString(projectPath) shouldBe """{"inputPath":"foo","name":"aname"}"""
68+
}
6969
}
7070

7171
}

‎joern-cli/frontends/abap2cpg/build.sbt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ dependsOn(
1111

1212
libraryDependencies ++= Seq(
1313
"io.shiftleft" %% "codepropertygraph" % Versions.cpg,
14-
"com.lihaoyi" %% "ujson" % "4.1.0",
14+
"com.lihaoyi" %% "ujson" % Versions.upickle,
1515
"org.scalatest" %% "scalatest" % Versions.scalatest % Test
1616
)
1717

‎joern-cli/src/main/scala/io/joern/joerncli/JoernScan.scala‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.joern.joerncli
22

33
import io.joern.console.scan.{ScanPass, outputFindings}
4-
import io.joern.console.{BridgeBase, DefaultArgumentProvider, Query, QueryDatabase}
4+
import io.joern.console.{BridgeBase, DefaultArgumentProvider, Query, QueryDatabase, QueryJsonSerialization}
55
import io.joern.dataflowengineoss.queryengine.{EngineConfig, EngineContext}
66
import io.joern.dataflowengineoss.semanticsloader.{NoSemantics, Semantics}
77
import io.joern.joerncli.JoernScan.getQueriesFromQueryDb
@@ -12,8 +12,6 @@ import io.shiftleft.semanticcpg.language.locationCreator
1212
import io.shiftleft.semanticcpg.layers.{LayerCreator, LayerCreatorContext, LayerCreatorOptions}
1313
import io.shiftleft.semanticcpg.utils.FileUtil
1414
import io.shiftleft.semanticcpg.utils.FileUtil.*
15-
import org.json4s.native.Serialization
16-
import org.json4s.{Formats, NoTypeHints}
1715
import scopt.OptionParser
1816

1917
import java.nio.file.{Files, Path, Paths}
@@ -134,10 +132,9 @@ object JoernScan extends BridgeBase {
134132

135133
private def dumpQueriesAsJson(outFileName: String): Unit = {
136134
implicit val engineContext: EngineContext = EngineContext(NoSemantics)
137-
implicit val formats: AnyRef & Formats = Serialization.formats(NoTypeHints)
138135
val queryDb = new QueryDatabase(new JoernDefaultArgumentProvider(0))
139136
val outFile = Paths.get(outFileName)
140-
Files.writeString(outFile, Serialization.write(queryDb.allQueries))
137+
Files.writeString(outFile, QueryJsonSerialization.write(queryDb.allQueries))
141138
println(s"Queries written to: $outFileName")
142139
}
143140

‎joern-cli/src/main/scala/io/joern/joerncli/JoernVectors.scala‎

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import io.shiftleft.codepropertygraph.generated.Cpg
55
import io.shiftleft.codepropertygraph.generated.PropertyNames
66
import io.shiftleft.codepropertygraph.generated.nodes.{AstNode, Method}
77
import io.shiftleft.semanticcpg.language.*
8-
import org.json4s.DefaultFormats
9-
import org.json4s.native.Serialization
8+
import io.shiftleft.semanticcpg.utils.JsonRenderer
109

1110
import scala.collection.mutable
1211
import scala.jdk.CollectionConverters.*
@@ -119,17 +118,16 @@ trait EmbeddingGenerator[T, S] {
119118

120119
def objectToString(t: T): String
121120

122-
implicit val formats: DefaultFormats.type = org.json4s.DefaultFormats
123-
124121
def vectorToString(vector: Map[S, Double]): String = defaultToString(vector)
125122

126-
def defaultToString[M](v: M): String = Serialization.write(v)
123+
def defaultToString[M](value: M): String = ujson.write(JoernVectors.jsonRenderer.render(value))
127124

128125
}
129126

130127
object JoernVectors {
131128

132-
implicit val formats: DefaultFormats.type = org.json4s.DefaultFormats
129+
private[joerncli] val jsonRenderer = new JsonRenderer()
130+
133131
case class Config(cpgFileName: String = "cpg.bin", outDir: String = "out", dimToFeature: Boolean = false)
134132

135133
def main(args: Array[String]) = {
@@ -143,7 +141,7 @@ object JoernVectors {
143141
traversalToJson(embedding.objects, generator.defaultToString)
144142
if (config.dimToFeature) {
145143
println(",\"dimToFeature\": ")
146-
println(Serialization.write(embedding.dimToStructure))
144+
println(generator.defaultToString(embedding.dimToStructure))
147145
}
148146
println(",\"vectors\":")
149147
traversalToJson(embedding.vectors, generator.vectorToString)

0 commit comments

Comments
 (0)