in src/main/kotlin/com/github/mkartashev/hserr/miner/artifact/Version.kt [42:120]
override fun extract(log: HsErrLog): VersionArtifact {
val header = log.getArtifact(HeaderArtifact::class) ?: fail("No Summary section found")
var jreVersionSelection = header.location.start.moveToLineStartsWithString("# JRE version:").selectUpToEOL()
val jvmVersionSelection = header.location.start.moveToLineStartsWithString("# Java VM:").selectUpToEOL()
// vm_info: OpenJDK 64-Bit Server VM (17.0.6+10-b888.3) for linux-amd64 JRE (17.0.6+10-b888.3), built on 2024-03-17 by "builduser" with gcc 8.3.1 20190311 (Red Hat 8.3.1-3)
val vmInfoSel = log.start.moveToLineStartsWithString("vm_info:").selectUpToEOL()
if (jreVersionSelection.isEmpty() && vmInfoSel.isEmpty()) fail("Couldn't locate JRE version")
if (jvmVersionSelection.isEmpty() && vmInfoSel.isEmpty()) fail("Couldn't locate Java VM version")
var jreVersionBuild = ""
var jreVersionFull = ""
var jvmVersionBuild = ""
var jvmVersionFull = ""
// # JRE version: OpenJDK Runtime Environment JBR-17.0.3+7-469.12-jcef (17.0.3+7) (build 17.0.3+7-b469.12)
val jreVersionTokens = jreVersionSelection.toString().split(' ')
if (jreVersionTokens.size >= 8) {
if (!jreVersionTokens[jreVersionTokens.lastIndex - 1].contains("build")) fail("Couldn't find JRE build number")
jreVersionBuild = jreVersionTokens.lastOrNull()?.trim('(', ')') ?: ""
jreVersionFull =
jreVersionTokens.dropWhile { !it.contains('.') }.firstOrNull()?.trim('(', ')') ?: ""
}
// # Java VM: OpenJDK 64-Bit Server VM JBR-17.0.3+7-469.12-jcef (17.0.3+7-b469.12, mixed mode, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-aarch64)
val jvmVersionTokens = jvmVersionSelection.toString().split(' ')
if (jvmVersionTokens.size >= 9) {
jvmVersionFull = jvmVersionTokens.dropWhile { !it.contains('.') }.firstOrNull()?.trim(',') ?: ""
jvmVersionBuild =
jvmVersionTokens.dropWhile { !it.startsWith('(') }.dropWhile { !it.contains('.') }.firstOrNull()
?.trim('(', ')', ',') ?: ""
}
val vmInfo = vmInfoSel.toString()
if (jreVersionBuild.isEmpty() || jreVersionFull.isEmpty()) {
// try getting from "vm_info:" line
jreVersionBuild = vmInfo.substringAfter("JRE (").substringBefore(')')
jreVersionFull = jreVersionBuild
jreVersionSelection = vmInfoSel
}
jvmVersionFull = jvmVersionFull.trim { it == '(' || it == ')' || it == ',' }
if (jvmVersionBuild.isEmpty() || jvmVersionFull.isEmpty()) {
// try getting from "vm_info:" line
jvmVersionBuild = vmInfo.substringAfter('(').substringBefore(')')
jvmVersionFull = jvmVersionBuild
jreVersionSelection = vmInfoSel
}
val vmInfoBuild = vmInfo.substringAfter("built on ", "")
val buildDateCandidate = vmInfoBuild.substringBefore(' ')
val buildDateString =
if (buildDateCandidate.length >= 10) buildDateCandidate.substring(0, 10) else buildDateCandidate
val buildDate = try {
LocalDate.parse(buildDateString)
} catch (ignored: DateTimeParseException) {
Artifact.DEFAULT_DATE
}
val buildWith = if (vmInfoBuild.contains(" with ")) {
vmInfoBuild.substringAfter(" with ").trim()
} else {
Artifact.DEFAULT_STRING
}
return VersionArtifact(
log,
jreVersionSelection, jvmVersionSelection,
buildDate,
jreVersionFull.trim(), jreVersionBuild.trim(),
jvmVersionFull.trim(), jvmVersionBuild.trim(),
buildWith
)
}