project/JavaOptions.scala (95 lines of code) (raw):

object JavaOptions { class JavaOption( val option: String, val args: List[String], val isSupported: Int => Boolean ) { override def hashCode(): Int = 41 * option.hashCode override def equals(other: Any): Boolean = other match { case that: JavaOption => this.option == that.option && this.args.size == that.args.size && this.args.sorted.zip(that.args.sorted).forall { case (s1, s2) => s1 == s2 } case _ => false } override def toString = (option :: args).mkString("JavaOption(", " ", ")") } def property( key: String, value: String, isSupported: Int => Boolean = _ => true ): JavaOption = new JavaOption(s"-D$key=$value", List.empty, isSupported) def extra( name: String, arguments: List[String] = List.empty, isSupported: Int => Boolean = _ => true ): JavaOption = new JavaOption(s"-X$name", arguments, isSupported) def minHeapSize(size: String): JavaOption = extra(s"ms$size") def maxHeapSize(size: String): JavaOption = extra(s"mx$size") def advanced( name: String, arguments: List[String] = List.empty, isSupported: Int => Boolean = _ => true ): JavaOption = new JavaOption(s"-XX:$name", arguments, isSupported) def addOpens(module: String, `package`: String, reflectingModule: String) = new JavaOption("--add-opens", List(s"$module/${`package`}=$reflectingModule"), _ >= 17) def optionsForVersion( javaVersion: Int, proposedJavacOptions: Set[JavaOption] ): Set[JavaOption] = proposedJavacOptions.filter(_.isSupported(javaVersion)) def tokensForVersion( javaVersion: Int, proposedJavacOptions: Set[JavaOption] ): Seq[String] = optionsForVersion(javaVersion, proposedJavacOptions).toList .flatMap(opt => opt.option :: opt.args) def defaults(javaVersion: Int): Seq[String] = tokensForVersion( javaVersion, Set( property("file.encoding", "UTF-8"), addOpens("java.base", "java.util", "ALL-UNNAMED"), addOpens("java.base", "java.lang.invoke", "ALL-UNNAMED"), addOpens("java.base", "java.lang", "ALL-UNNAMED"), addOpens("java.base", "java.nio", "ALL-UNNAMED") ) ) def testDefaults(javaVersion: Int): Seq[String] = tokensForVersion( javaVersion, Set( minHeapSize("512m"), maxHeapSize("2G"), advanced("+UseParallelGC"), property("scio.ignoreVersionWarning", "true"), property("org.slf4j.simpleLogger.defaultLogLevel", "info"), property("org.slf4j.simpleLogger.logFile", "scio.log") ) ++ Set( "bigquery.project", "bigquery.secret", "cloudsql.sqlserver.password" ).flatMap(prop => sys.props.get(prop).map(value => property(prop, value))) ) def runDefaults(javaVersion: Int): Seq[String] = tokensForVersion( javaVersion, Set( minHeapSize("512m"), maxHeapSize("2G"), advanced("+UseParallelGC"), property("scio.ignoreVersionWarning", "true"), property("org.slf4j.simpleLogger.defaultLogLevel", "info") ) ++ Set( "bigquery.project", "bigquery.secret", "cloudsql.sqlserver.password" ).flatMap(prop => sys.props.get(prop).map(value => property(prop, value))) ) }