Skip to content

Commit

Permalink
feat: Add multi java lts support.
Browse files Browse the repository at this point in the history
  • Loading branch information
He-Pin committed Jan 27, 2024
1 parent a2b5b5d commit f39b6d8
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 48 deletions.
Original file line number Diff line number Diff line change
@@ -1,33 +1,38 @@

package docs.actors.classical;
// #pattern-matching

static class OptimizedActorWithJava21 extends UntypedAbstractActor {
public static class Msg1 {}
import org.apache.pekko.actor.UntypedAbstractActor;

public class OptimizedActorWithJava21 extends UntypedAbstractActor {
public static class Msg1 {
}

public static class Msg2 {}
public static class Msg2 {
}

public static class Msg3 {}
public static class Msg3 {
}

@Override
public void onReceive(Object msg) throws Exception {
switch(msg) {
case Msg1 msg -> receiveMsg1((Msg1) msg);
case Msg2 msg -> receiveMsg2((Msg2) msg);
case Msg3 msg -> receiveMsg3((Msg3) msg);
default _ -> unhandled(msg);
@Override
public void onReceive(Object msg) throws Exception {
switch (msg) {
case Msg1 msg1 -> receiveMsg1(msg1);
case Msg2 msg2 -> receiveMsg2(msg2);
case Msg3 msg3 -> receiveMsg3(msg3);
default -> unhandled(msg);
}
}
}

private void receiveMsg1(Msg1 msg) {
// actual work
}
private void receiveMsg1(Msg1 msg) {
// actual work
}

private void receiveMsg2(Msg2 msg) {
// actual work
}
private void receiveMsg2(Msg2 msg) {
// actual work
}

private void receiveMsg3(Msg3 msg) {
// actual work
}
private void receiveMsg3(Msg3 msg) {
// actual work
}
}
// #pattern-matching
23 changes: 12 additions & 11 deletions project/CopyrightHeaderForJdk9.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,25 @@
*/

import de.heikoseeberger.sbtheader.HeaderPlugin.autoImport.headerSources
import sbt.Keys.sourceDirectory
import sbt.{ Compile, Def, Test, _ }

object CopyrightHeaderForJdk9 extends AutoPlugin {

override lazy val requires = CopyrightHeader && Jdk9
override lazy val trigger = allRequirements

override lazy val projectSettings: Seq[Def.Setting[_]] = {
private lazy val additionalFiles = Def.setting {
import Jdk9._
Seq(
Compile / headerSources ++=
(((Compile / sourceDirectory).value / SCALA_SOURCE_DIRECTORY) ** "*.scala").get,
Test / headerSources ++=
(((Test / sourceDirectory).value / SCALA_TEST_SOURCE_DIRECTORY) ** "*.scala").get,
Compile / headerSources ++=
(((Compile / sourceDirectory).value / JAVA_SOURCE_DIRECTORY) ** "*.java").get,
Test / headerSources ++=
(((Test / sourceDirectory).value / JAVA_TEST_SOURCE_DIRECTORY) ** "*.java").get)
for {
dir <- additionalSourceDirectories.value ++ additionalTestSourceDirectories.value
language <- List("java", "scala")
file <- (dir ** s"*.$language").get
} yield file
}

override lazy val projectSettings: Seq[Def.Setting[_]] = {

Seq(Compile / headerSources ++= additionalFiles.value,
Test / headerSources ++= additionalFiles.value)
}
}
77 changes: 64 additions & 13 deletions project/Jdk9.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,36 +11,87 @@
* Copyright (C) 2017-2022 Lightbend Inc. <https://www.lightbend.com>
*/

import sbt._
import sbt.Keys._
import sbt._

object Jdk9 extends AutoPlugin {
import JdkOptions.notOnJdk8

// The version 9 is special for any Java versions >= 9
// and the version 11 is special for any Java versions >= 11
// and the version 17 is special for any Java versions >= 17
// and the version 21 is special for any Java versions >= 21
private val supportedJavaLTSVersions = List("9", "11", "17", "21")

lazy val CompileJdk9 = config("CompileJdk9").extend(Compile)

lazy val TestJdk9 = config("TestJdk9").extend(Test).extend(CompileJdk9)

val SCALA_SOURCE_DIRECTORY = "scala-jdk-9"
val SCALA_TEST_SOURCE_DIRECTORY = "scala-jdk9-only"
val JAVA_SOURCE_DIRECTORY = "java-jdk-9"
val JAVA_TEST_SOURCE_DIRECTORY = "java-jdk9-only"
lazy val SCALA_SOURCE_DIRECTORY = getAdditionalSourceDirectoryNames("scala", isTest = false)
lazy val SCALA_TEST_SOURCE_DIRECTORY = getAdditionalSourceDirectoryNames("scala", isTest = true)

lazy val JAVA_SOURCE_DIRECTORY = getAdditionalSourceDirectoryNames("java", isTest = false)
lazy val JAVA_TEST_SOURCE_DIRECTORY = getAdditionalSourceDirectoryNames("java", isTest = true)

private lazy val additionalScalaSourceDirectories = Def.setting {
getAdditionalSourceDirectories(
(Compile / sourceDirectory).value,
SCALA_SOURCE_DIRECTORY)
}

private lazy val additionalJavaSourceDirectories = Def.setting {
getAdditionalSourceDirectories(
(Compile / sourceDirectory).value,
JAVA_SOURCE_DIRECTORY)
}

lazy val additionalSourceDirectories = Def.setting {
additionalScalaSourceDirectories.value ++ additionalJavaSourceDirectories.value
}

private lazy val additionalScalaTestSourceDirectories = Def.setting {
getAdditionalSourceDirectories(
(Test / sourceDirectory).value,
SCALA_TEST_SOURCE_DIRECTORY)
}

private lazy val additionalJavaTestSourceDirectories = Def.setting {
getAdditionalSourceDirectories(
(Test / sourceDirectory).value,
JAVA_TEST_SOURCE_DIRECTORY)
}

lazy val additionalTestSourceDirectories = Def.setting {
additionalScalaTestSourceDirectories.value ++ additionalJavaTestSourceDirectories.value
}

private def getAdditionalSourceDirectoryNames(language: String, isTest: Boolean): Seq[String] = {
for {
version <- supportedJavaLTSVersions if version.toInt <= JdkOptions.JavaVersion.majorVersion
} yield {
if (isTest) {
s"$language-jdk${version}-only"
} else {
s"$language-jdk-$version"
}
}
}

private def getAdditionalSourceDirectories(baseDirectory: File,
sourceDirectoryNames: Seq[String]): Seq[File] = {
for (sourceDirectoryName <- sourceDirectoryNames)
yield baseDirectory / sourceDirectoryName
}

lazy val compileJdk9Settings = Seq(
// following the scala-2.12, scala-sbt-1.0, ... convention
unmanagedSourceDirectories := notOnJdk8(
Seq(
(Compile / sourceDirectory).value / SCALA_SOURCE_DIRECTORY,
(Compile / sourceDirectory).value / JAVA_SOURCE_DIRECTORY)),
unmanagedSourceDirectories := notOnJdk8(additionalSourceDirectories.value),
scalacOptions := PekkoBuild.DefaultScalacOptions.value ++ notOnJdk8(Seq("-release", "11")),
javacOptions := PekkoBuild.DefaultJavacOptions ++ notOnJdk8(Seq("--release", "11")))

lazy val testJdk9Settings = Seq(
// following the scala-2.12, scala-sbt-1.0, ... convention
unmanagedSourceDirectories := notOnJdk8(
Seq(
(Test / sourceDirectory).value / SCALA_TEST_SOURCE_DIRECTORY,
(Test / sourceDirectory).value / JAVA_TEST_SOURCE_DIRECTORY)),
unmanagedSourceDirectories := notOnJdk8(additionalTestSourceDirectories.value),
scalacOptions := PekkoBuild.DefaultScalacOptions.value ++ notOnJdk8(Seq("-release", "11")),
javacOptions := PekkoBuild.DefaultJavacOptions ++ notOnJdk8(Seq("--release", "11")),
compile := compile.dependsOn(CompileJdk9 / compile).value,
Expand Down
13 changes: 13 additions & 0 deletions project/JdkOptions.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,19 @@ object JdkOptions extends AutoPlugin {

lazy val specificationVersion: String = sys.props("java.specification.version")

object JavaVersion {
val majorVersion: Int = {
// FIXME replace with Runtime.version() when we no longer support Java 8
// See Oracle section 1.5.3 at:
// https://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html
val version = specificationVersion.split('.')
val majorString =
if (version(0) == "1") version(1) // Java 8 will be 1.8
else version(0) // later will be 9, 10, 11 etc
majorString.toInt
}
}

lazy val isJdk8: Boolean =
VersionNumber(specificationVersion).matchesSemVer(SemanticSelector(s"=1.8"))
lazy val isJdk11orHigher: Boolean =
Expand Down
4 changes: 2 additions & 2 deletions project/ProjectFileIgnoreSupport.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ import sbt.ConsoleLogger
class ProjectFileIgnoreSupport(ignoreConfigFile: File, descriptor: String) {
private lazy val stdoutLogger = ConsoleLogger(System.out)

private val javaSourceDirectories = Set("java", Jdk9.JAVA_SOURCE_DIRECTORY, Jdk9.JAVA_TEST_SOURCE_DIRECTORY)
private val javaSourceDirectories = Set("java") ++ Jdk9.JAVA_SOURCE_DIRECTORY ++ Jdk9.JAVA_TEST_SOURCE_DIRECTORY

private val scalaSourceDirectories = Set("scala", Jdk9.SCALA_SOURCE_DIRECTORY, Jdk9.SCALA_TEST_SOURCE_DIRECTORY)
private val scalaSourceDirectories = Set("scala") ++ Jdk9.SCALA_SOURCE_DIRECTORY ++ Jdk9.SCALA_TEST_SOURCE_DIRECTORY

private lazy val ignoreConfig = {
require(
Expand Down

0 comments on commit f39b6d8

Please sign in to comment.