2019-11-06 12:59:12 +00:00
use crate ::configs ::java ::JavaConfig ;
2020-07-07 22:45:32 +00:00
use crate ::formatter ::StringFormatter ;
2019-09-19 23:02:53 +00:00
2020-07-07 22:45:32 +00:00
use super ::{ Context , Module , RootModuleConfig } ;
2019-09-19 23:02:53 +00:00
2020-07-29 16:26:46 +00:00
use regex ::Regex ;
const JAVA_VERSION_PATTERN : & str = " (?P<version>[ \\ d \\ .]+)[^ \\ s]* \\ s(?:built|from) " ;
2019-09-19 23:02:53 +00:00
/// Creates a module with the current Java version
///
/// Will display the Java version if any of the following criteria are met:
2020-11-30 12:50:56 +00:00
/// - Current directory contains a file with a `.java`, `.class`, `.jar`, `.gradle`, `.clj`, or `.cljc` extension
/// - Current directory contains a `pom.xml`, `build.gradle.kts`, `build.sbt`, `.java-version`, `deps.edn`, `project.clj`, or `build.boot` file
2019-09-19 23:02:53 +00:00
pub fn module < ' a > ( context : & ' a Context ) -> Option < Module < ' a > > {
let is_java_project = context
. try_begin_scan ( ) ?
2020-11-30 12:50:56 +00:00
. set_files ( & [
" pom.xml " ,
" build.gradle.kts " ,
" build.sbt " ,
" .java-version " ,
" deps.edn " ,
" project.clj " ,
" build.boot " ,
] )
. set_extensions ( & [ " java " , " class " , " jar " , " gradle " , " clj " , " cljc " ] )
2019-09-19 23:02:53 +00:00
. is_match ( ) ;
if ! is_java_project {
return None ;
}
2020-07-29 16:26:46 +00:00
let mut module = context . new_module ( " java " ) ;
let config : JavaConfig = JavaConfig ::try_load ( module . config ) ;
let parsed = StringFormatter ::new ( config . format ) . and_then ( | formatter | {
formatter
. map_meta ( | var , _ | match var {
" symbol " = > Some ( config . symbol ) ,
_ = > None ,
} )
. map_style ( | variable | match variable {
" style " = > Some ( Ok ( config . style ) ) ,
_ = > None ,
} )
. map ( | variable | match variable {
2021-01-20 17:51:30 +00:00
" version " = > {
let java_version = get_java_version ( context ) ? ;
Some ( Ok ( java_version ) )
}
2020-07-29 16:26:46 +00:00
_ = > None ,
} )
. parse ( None )
} ) ;
module . set_segments ( match parsed {
Ok ( segments ) = > segments ,
Err ( error ) = > {
log ::warn! ( " Error in module `java`: \n {} " , error ) ;
return None ;
2019-09-19 23:02:53 +00:00
}
2020-07-29 16:26:46 +00:00
} ) ;
Some ( module )
2019-09-19 23:02:53 +00:00
}
2020-08-07 19:13:12 +00:00
fn get_java_version ( context : & Context ) -> Option < String > {
let java_command = match context . get_env ( " JAVA_HOME " ) {
Some ( java_home ) = > format! ( " {} /bin/java " , java_home ) ,
None = > String ::from ( " java " ) ,
2019-09-19 23:02:53 +00:00
} ;
2021-02-11 20:34:47 +00:00
let output = context . exec_cmd ( & java_command . as_str ( ) , & [ " -Xinternalversion " ] ) ? ;
2020-07-29 16:26:46 +00:00
let java_version = if output . stdout . is_empty ( ) {
output . stderr
} else {
output . stdout
} ;
parse_java_version ( & java_version )
2019-10-25 01:00:05 +00:00
}
2020-07-29 16:26:46 +00:00
fn parse_java_version ( java_version : & str ) -> Option < String > {
let re = Regex ::new ( JAVA_VERSION_PATTERN ) . ok ( ) ? ;
let captures = re . captures ( java_version ) ? ;
let version = & captures [ " version " ] ;
Some ( format! ( " v {} " , & version ) )
2019-09-19 23:02:53 +00:00
}
#[ cfg(test) ]
mod tests {
use super ::* ;
2021-02-13 18:32:35 +00:00
use crate ::{ test ::ModuleRenderer , utils ::CommandOutput } ;
2020-07-29 16:26:46 +00:00
use ansi_term ::Color ;
use std ::fs ::File ;
use std ::io ;
#[ test ]
fn test_parse_java_version_openjdk ( ) {
let java_8 = " OpenJDK 64-Bit Server VM (25.222-b10) for linux-amd64 JRE (1.8.0_222-b10), built on Jul 11 2019 10:18:43 by \" openjdk \" with gcc 4.4.7 20120313 (Red Hat 4.4.7-23) " ;
let java_11 = " OpenJDK 64-Bit Server VM (11.0.4+11-post-Ubuntu-1ubuntu219.04) for linux-amd64 JRE (11.0.4+11-post-Ubuntu-1ubuntu219.04), built on Jul 18 2019 18:21:46 by \" build \" with gcc 8.3.0 " ;
assert_eq! ( parse_java_version ( java_11 ) , Some ( " v11.0.4 " . to_string ( ) ) ) ;
assert_eq! ( parse_java_version ( java_8 ) , Some ( " v1.8.0 " . to_string ( ) ) ) ;
}
#[ test ]
fn test_parse_java_version_oracle ( ) {
let java_8 = " Java HotSpot(TM) Client VM (25.65-b01) for linux-arm-vfp-hflt JRE (1.8.0_65-b17), built on Oct 6 2015 16:19:04 by \" java_re \" with gcc 4.7.2 20120910 (prerelease) " ;
assert_eq! ( parse_java_version ( java_8 ) , Some ( " v1.8.0 " . to_string ( ) ) ) ;
}
#[ test ]
fn test_parse_java_version_redhat ( ) {
let java_8 = " OpenJDK 64-Bit Server VM (25.222-b10) for linux-amd64 JRE (1.8.0_222-b10), built on Jul 11 2019 20:48:53 by \" root \" with gcc 7.3.1 20180303 (Red Hat 7.3.1-5) " ;
let java_12 = " OpenJDK 64-Bit Server VM (12.0.2+10) for linux-amd64 JRE (12.0.2+10), built on Jul 18 2019 14:41:47 by \" jenkins \" with gcc 7.3.1 20180303 (Red Hat 7.3.1-5) " ;
assert_eq! ( parse_java_version ( java_8 ) , Some ( " v1.8.0 " . to_string ( ) ) ) ;
assert_eq! ( parse_java_version ( java_12 ) , Some ( " v12.0.2 " . to_string ( ) ) ) ;
}
#[ test ]
fn test_parse_java_version_zulu ( ) {
let java_8 = " OpenJDK 64-Bit Server VM (25.222-b10) for linux-amd64 JRE (Zulu 8.40.0.25-CA-linux64) (1.8.0_222-b10), built on Jul 11 2019 11:36:39 by \" zulu_re \" with gcc 4.4.7 20120313 (Red Hat 4.4.7-3) " ;
let java_11 = " OpenJDK 64-Bit Server VM (11.0.4+11-LTS) for linux-amd64 JRE (Zulu11.33+15-CA) (11.0.4+11-LTS), built on Jul 11 2019 21:37:17 by \" zulu_re \" with gcc 4.9.2 20150212 (Red Hat 4.9.2-6) " ;
assert_eq! ( parse_java_version ( java_8 ) , Some ( " v1.8.0 " . to_string ( ) ) ) ;
assert_eq! ( parse_java_version ( java_11 ) , Some ( " v11.0.4 " . to_string ( ) ) ) ;
}
#[ test ]
fn test_parse_java_version_eclipse_openj9 ( ) {
let java_8 = " Eclipse OpenJ9 OpenJDK 64-bit Server VM (1.8.0_222-b10) from linux-amd64 JRE with Extensions for OpenJDK for Eclipse OpenJ9 8.0.222.0, built on Jul 17 2019 21:29:18 by jenkins with g++ (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) " ;
let java_11 = " Eclipse OpenJ9 OpenJDK 64-bit Server VM (11.0.4+11) from linux-amd64 JRE with Extensions for OpenJDK for Eclipse OpenJ9 11.0.4.0, built on Jul 17 2019 21:51:37 by jenkins with g++ (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) " ;
assert_eq! ( parse_java_version ( java_8 ) , Some ( " v1.8.0 " . to_string ( ) ) ) ;
assert_eq! ( parse_java_version ( java_11 ) , Some ( " v11.0.4 " . to_string ( ) ) ) ;
}
#[ test ]
fn test_parse_java_version_graalvm ( ) {
let java_8 = " OpenJDK 64-Bit GraalVM CE 19.2.0.1 (25.222-b08-jvmci-19.2-b02) for linux-amd64 JRE (8u222), built on Jul 19 2019 17:37:13 by \" buildslave \" with gcc 7.3.0 " ;
assert_eq! ( parse_java_version ( java_8 ) , Some ( " v8 " . to_string ( ) ) ) ;
}
#[ test ]
fn test_parse_java_version_amazon_corretto ( ) {
let java_8 = " OpenJDK 64-Bit Server VM (25.222-b10) for linux-amd64 JRE (1.8.0_222-b10), built on Jul 11 2019 20:48:53 by \" root \" with gcc 7.3.1 20180303 (Red Hat 7.3.1-5) " ;
let java_11 = " OpenJDK 64-Bit Server VM (11.0.4+11-LTS) for linux-amd64 JRE (11.0.4+11-LTS), built on Jul 11 2019 20:06:11 by \" \" with gcc 7.3.1 20180303 (Red Hat 7.3.1-5) " ;
assert_eq! ( parse_java_version ( java_8 ) , Some ( " v1.8.0 " . to_string ( ) ) ) ;
assert_eq! ( parse_java_version ( java_11 ) , Some ( " v11.0.4 " . to_string ( ) ) ) ;
}
#[ test ]
fn test_parse_java_version_sapmachine ( ) {
let java_11 = " OpenJDK 64-Bit Server VM (11.0.4+11-LTS-sapmachine) for linux-amd64 JRE (11.0.4+11-LTS-sapmachine), built on Jul 17 2019 08:58:43 by \" \" with gcc 7.3.0 " ;
assert_eq! ( parse_java_version ( java_11 ) , Some ( " v11.0.4 " . to_string ( ) ) ) ;
}
#[ test ]
fn test_parse_java_version_unknown ( ) {
let unknown_jre = " Unknown JRE " ;
assert_eq! ( parse_java_version ( unknown_jre ) , None ) ;
}
2019-09-19 23:02:53 +00:00
#[ test ]
2020-07-29 16:26:46 +00:00
fn folder_without_java_file ( ) -> io ::Result < ( ) > {
let dir = tempfile ::tempdir ( ) ? ;
2020-08-07 19:13:12 +00:00
let actual = ModuleRenderer ::new ( " java " ) . path ( dir . path ( ) ) . collect ( ) ;
2020-07-29 16:26:46 +00:00
let expected = None ;
assert_eq! ( expected , actual ) ;
dir . close ( )
2019-09-19 23:02:53 +00:00
}
#[ test ]
2020-07-29 16:26:46 +00:00
fn folder_with_java_file ( ) -> io ::Result < ( ) > {
let dir = tempfile ::tempdir ( ) ? ;
File ::create ( dir . path ( ) . join ( " Main.java " ) ) ? . sync_all ( ) ? ;
2020-08-07 19:13:12 +00:00
let actual = ModuleRenderer ::new ( " java " ) . path ( dir . path ( ) ) . collect ( ) ;
2021-01-20 17:51:30 +00:00
let expected = Some ( format! ( " via {} " , Color ::Red . dimmed ( ) . paint ( " ☕ v13.0.2 " ) ) ) ;
2020-07-29 16:26:46 +00:00
assert_eq! ( expected , actual ) ;
dir . close ( )
2019-09-19 23:02:53 +00:00
}
2021-02-13 18:32:35 +00:00
#[ test ]
fn folder_with_java_file_preview ( ) -> io ::Result < ( ) > {
let dir = tempfile ::tempdir ( ) ? ;
File ::create ( dir . path ( ) . join ( " Main.java " ) ) ? . sync_all ( ) ? ;
let actual = ModuleRenderer ::new ( " java " ) . cmd ( " java -Xinternalversion " , Some ( CommandOutput {
stdout : " OpenJDK 64-Bit Server VM (16+14) for bsd-aarch64 JRE (16+14), built on Jan 17 2021 07:19:47 by \" brew \" with clang Apple LLVM 12.0.0 (clang-1200.0.32.28) \n " . to_owned ( ) ,
stderr : " " . to_owned ( )
} ) ) . path ( dir . path ( ) ) . collect ( ) ;
let expected = Some ( format! ( " via {} " , Color ::Red . dimmed ( ) . paint ( " ☕ v16 " ) ) ) ;
assert_eq! ( expected , actual ) ;
dir . close ( )
}
#[ test ]
fn folder_with_java_file_no_java_installed ( ) -> io ::Result < ( ) > {
let dir = tempfile ::tempdir ( ) ? ;
File ::create ( dir . path ( ) . join ( " Main.java " ) ) ? . sync_all ( ) ? ;
let actual = ModuleRenderer ::new ( " java " )
. cmd ( " java -Xinternalversion " , None )
. path ( dir . path ( ) )
. collect ( ) ;
let expected = Some ( format! ( " via {} " , Color ::Red . dimmed ( ) . paint ( " ☕ " ) ) ) ;
assert_eq! ( expected , actual ) ;
dir . close ( )
}
2019-09-19 23:02:53 +00:00
#[ test ]
2020-07-29 16:26:46 +00:00
fn folder_with_class_file ( ) -> io ::Result < ( ) > {
let dir = tempfile ::tempdir ( ) ? ;
File ::create ( dir . path ( ) . join ( " Main.class " ) ) ? . sync_all ( ) ? ;
2020-08-07 19:13:12 +00:00
let actual = ModuleRenderer ::new ( " java " ) . path ( dir . path ( ) ) . collect ( ) ;
2021-01-20 17:51:30 +00:00
let expected = Some ( format! ( " via {} " , Color ::Red . dimmed ( ) . paint ( " ☕ v13.0.2 " ) ) ) ;
2020-07-29 16:26:46 +00:00
assert_eq! ( expected , actual ) ;
dir . close ( )
2019-09-19 23:02:53 +00:00
}
#[ test ]
2020-07-29 16:26:46 +00:00
fn folder_with_gradle_file ( ) -> io ::Result < ( ) > {
let dir = tempfile ::tempdir ( ) ? ;
File ::create ( dir . path ( ) . join ( " build.gradle " ) ) ? . sync_all ( ) ? ;
2020-08-07 19:13:12 +00:00
let actual = ModuleRenderer ::new ( " java " ) . path ( dir . path ( ) ) . collect ( ) ;
2021-01-20 17:51:30 +00:00
let expected = Some ( format! ( " via {} " , Color ::Red . dimmed ( ) . paint ( " ☕ v13.0.2 " ) ) ) ;
2020-07-29 16:26:46 +00:00
assert_eq! ( expected , actual ) ;
dir . close ( )
2019-10-25 01:00:05 +00:00
}
#[ test ]
2020-07-29 16:26:46 +00:00
fn folder_with_jar_archive ( ) -> io ::Result < ( ) > {
let dir = tempfile ::tempdir ( ) ? ;
File ::create ( dir . path ( ) . join ( " test.jar " ) ) ? . sync_all ( ) ? ;
2020-08-07 19:13:12 +00:00
let actual = ModuleRenderer ::new ( " java " ) . path ( dir . path ( ) ) . collect ( ) ;
2021-01-20 17:51:30 +00:00
let expected = Some ( format! ( " via {} " , Color ::Red . dimmed ( ) . paint ( " ☕ v13.0.2 " ) ) ) ;
2020-07-29 16:26:46 +00:00
assert_eq! ( expected , actual ) ;
dir . close ( )
2019-10-25 01:00:05 +00:00
}
#[ test ]
2020-07-29 16:26:46 +00:00
fn folder_with_pom_file ( ) -> io ::Result < ( ) > {
let dir = tempfile ::tempdir ( ) ? ;
File ::create ( dir . path ( ) . join ( " pom.xml " ) ) ? . sync_all ( ) ? ;
2020-08-07 19:13:12 +00:00
let actual = ModuleRenderer ::new ( " java " ) . path ( dir . path ( ) ) . collect ( ) ;
2021-01-20 17:51:30 +00:00
let expected = Some ( format! ( " via {} " , Color ::Red . dimmed ( ) . paint ( " ☕ v13.0.2 " ) ) ) ;
2020-07-29 16:26:46 +00:00
assert_eq! ( expected , actual ) ;
dir . close ( )
2019-10-25 01:00:05 +00:00
}
#[ test ]
2020-07-29 16:26:46 +00:00
fn folder_with_gradle_kotlin_build_file ( ) -> io ::Result < ( ) > {
let dir = tempfile ::tempdir ( ) ? ;
File ::create ( dir . path ( ) . join ( " build.gradle.kts " ) ) ? . sync_all ( ) ? ;
2020-08-07 19:13:12 +00:00
let actual = ModuleRenderer ::new ( " java " ) . path ( dir . path ( ) ) . collect ( ) ;
2021-01-20 17:51:30 +00:00
let expected = Some ( format! ( " via {} " , Color ::Red . dimmed ( ) . paint ( " ☕ v13.0.2 " ) ) ) ;
2020-07-29 16:26:46 +00:00
assert_eq! ( expected , actual ) ;
dir . close ( )
2019-10-25 01:00:05 +00:00
}
#[ test ]
2020-07-29 16:26:46 +00:00
fn folder_with_sbt_build_file ( ) -> io ::Result < ( ) > {
let dir = tempfile ::tempdir ( ) ? ;
File ::create ( dir . path ( ) . join ( " build.gradle.kts " ) ) ? . sync_all ( ) ? ;
2020-08-07 19:13:12 +00:00
let actual = ModuleRenderer ::new ( " java " ) . path ( dir . path ( ) ) . collect ( ) ;
2021-01-20 17:51:30 +00:00
let expected = Some ( format! ( " via {} " , Color ::Red . dimmed ( ) . paint ( " ☕ v13.0.2 " ) ) ) ;
2020-07-29 16:26:46 +00:00
assert_eq! ( expected , actual ) ;
dir . close ( )
2019-10-25 01:00:05 +00:00
}
#[ test ]
2020-07-29 16:26:46 +00:00
fn folder_with_java_version_file ( ) -> io ::Result < ( ) > {
let dir = tempfile ::tempdir ( ) ? ;
File ::create ( dir . path ( ) . join ( " .java-version " ) ) ? . sync_all ( ) ? ;
2020-08-07 19:13:12 +00:00
let actual = ModuleRenderer ::new ( " java " ) . path ( dir . path ( ) ) . collect ( ) ;
2021-01-20 17:51:30 +00:00
let expected = Some ( format! ( " via {} " , Color ::Red . dimmed ( ) . paint ( " ☕ v13.0.2 " ) ) ) ;
2020-07-29 16:26:46 +00:00
assert_eq! ( expected , actual ) ;
dir . close ( )
2019-09-19 23:02:53 +00:00
}
}