From d7ddf3710f6aff40d0595430f5f49255c89fdca1 Mon Sep 17 00:00:00 2001 From: "Begonia, HE" <163421589+BegoniaHe@users.noreply.github.com> Date: Sun, 25 Jan 2026 04:52:35 +0100 Subject: refactor(java): modularize Java detection and management system - Split monolithic java.rs (1089 lines) into focused modules - detection: Java installation discovery - validation: Version validation and requirements checking - priority: Installation selection priority logic - provider: Java download provider trait - providers: Provider implementations (Adoptium) - persistence: Cache and catalog management - Add java_path_override field to Instance struct for per-instance Java configuration - Export JavaInstallation at core module level This refactoring improves maintainability and prepares for multi-vendor Java provider support. Reviewed-by: Claude Sonnet 4.5 --- src-tauri/src/core/java/priority.rs | 72 +++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src-tauri/src/core/java/priority.rs (limited to 'src-tauri/src/core/java/priority.rs') diff --git a/src-tauri/src/core/java/priority.rs b/src-tauri/src/core/java/priority.rs new file mode 100644 index 0000000..cf39fdd --- /dev/null +++ b/src-tauri/src/core/java/priority.rs @@ -0,0 +1,72 @@ +use tauri::AppHandle; + +use super::JavaInstallation; +use crate::core::java::persistence; +use crate::core::java::validation; + +pub async fn resolve_java_for_launch( + app_handle: &AppHandle, + instance_java_override: Option<&str>, + global_java_path: Option<&str>, + required_major_version: Option, + max_major_version: Option, +) -> Option { + if let Some(override_path) = instance_java_override { + if !override_path.is_empty() { + let path_buf = std::path::PathBuf::from(override_path); + if let Some(java) = validation::check_java_installation(&path_buf).await { + if is_version_compatible(&java, required_major_version, max_major_version) { + return Some(java); + } + } + } + } + + if let Some(global_path) = global_java_path { + if !global_path.is_empty() { + let path_buf = std::path::PathBuf::from(global_path); + if let Some(java) = validation::check_java_installation(&path_buf).await { + if is_version_compatible(&java, required_major_version, max_major_version) { + return Some(java); + } + } + } + } + + let preferred = persistence::get_preferred_java_path(app_handle); + if let Some(pref_path) = preferred { + let path_buf = std::path::PathBuf::from(&pref_path); + if let Some(java) = validation::check_java_installation(&path_buf).await { + if is_version_compatible(&java, required_major_version, max_major_version) { + return Some(java); + } + } + } + + let installations = super::detect_all_java_installations(app_handle).await; + installations + .into_iter() + .find(|java| is_version_compatible(java, required_major_version, max_major_version)) +} + +fn is_version_compatible( + java: &JavaInstallation, + required_major_version: Option, + max_major_version: Option, +) -> bool { + let major = validation::parse_java_version(&java.version); + + let meets_min = if let Some(required) = required_major_version { + major >= required as u32 + } else { + true + }; + + let meets_max = if let Some(max_version) = max_major_version { + major <= max_version + } else { + true + }; + + meets_min && meets_max +} -- cgit v1.2.3-70-g09d2