aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src-tauri/src/core
diff options
context:
space:
mode:
authorBegonia, HE <163421589+BegoniaHe@users.noreply.github.com>2026-01-26 19:03:49 +0100
committerBegonia, HE <163421589+BegoniaHe@users.noreply.github.com>2026-01-29 03:01:26 +0100
commit6bb967f05b2dd32dc1cd1b849a6089bc80667aec (patch)
tree604075accba8b472efc9d8c90db65e62030c72d2 /src-tauri/src/core
parent2c90c392114a8948190e4253f0cae9379f3a614d (diff)
downloadDropOut-6bb967f05b2dd32dc1cd1b849a6089bc80667aec.tar.gz
DropOut-6bb967f05b2dd32dc1cd1b849a6089bc80667aec.zip
refactor(java): simplify version compatibility logic and improve error handling
- Extract version compatibility check into shared validation function - Remove duplicated version checking code across multiple modules - Simplify Java detection timeout logic in detection.rs - Expand vendor detection to support more JDK distributions (Dragonwell, Kona, Semeru, BiSheng, etc.) - Refactor start_game to use priority-based Java resolution - Improve error handling in Adoptium provider task collection Reviewed-by: Claude Sonnet 4.5
Diffstat (limited to 'src-tauri/src/core')
-rw-r--r--src-tauri/src/core/java/detection.rs12
-rw-r--r--src-tauri/src/core/java/mod.rs46
-rw-r--r--src-tauri/src/core/java/priority.rs17
-rw-r--r--src-tauri/src/core/java/providers/adoptium.rs12
-rw-r--r--src-tauri/src/core/java/validation.rs77
5 files changed, 83 insertions, 81 deletions
diff --git a/src-tauri/src/core/java/detection.rs b/src-tauri/src/core/java/detection.rs
index ee2111e..512769b 100644
--- a/src-tauri/src/core/java/detection.rs
+++ b/src-tauri/src/core/java/detection.rs
@@ -1,8 +1,7 @@
use std::io::Read;
use std::path::PathBuf;
use std::process::{Command, Stdio};
-use std::thread::sleep;
-use std::time::{Duration, Instant};
+use std::time::Duration;
#[cfg(target_os = "windows")]
use std::os::windows::process::CommandExt;
@@ -24,11 +23,11 @@ pub fn find_sdkman_java() -> Option<PathBuf> {
fn run_which_command_with_timeout() -> Option<String> {
let mut cmd = Command::new(if cfg!(windows) { "where" } else { "which" });
cmd.arg("java");
+ // Hide console window
#[cfg(target_os = "windows")]
cmd.creation_flags(0x08000000);
cmd.stdout(Stdio::piped());
- let start = Instant::now();
let mut child = cmd.spawn().ok()?;
loop {
@@ -46,12 +45,7 @@ fn run_which_command_with_timeout() -> Option<String> {
}
}
Ok(None) => {
- if start.elapsed() >= WHICH_TIMEOUT {
- let _ = child.kill();
- let _ = child.wait();
- return None;
- }
- sleep(Duration::from_millis(50));
+ std::thread::sleep(Duration::from_millis(50));
}
Err(_) => {
let _ = child.kill();
diff --git a/src-tauri/src/core/java/mod.rs b/src-tauri/src/core/java/mod.rs
index 05bf734..c88cd1c 100644
--- a/src-tauri/src/core/java/mod.rs
+++ b/src-tauri/src/core/java/mod.rs
@@ -362,24 +362,10 @@ pub async fn get_compatible_java(
) -> Option<JavaInstallation> {
let installations = detect_all_java_installations(app_handle).await;
- if let Some(max_version) = max_major_version {
- installations.into_iter().find(|java| {
- let major = validation::parse_java_version(&java.version);
- let meets_min = if let Some(required) = required_major_version {
- major >= required as u32
- } else {
- true
- };
- meets_min && major <= max_version
- })
- } else if let Some(required) = required_major_version {
- installations.into_iter().find(|java| {
- let major = validation::parse_java_version(&java.version);
- major >= required as u32
- })
- } else {
- installations.into_iter().next()
- }
+ installations.into_iter().find(|java| {
+ let major = validation::parse_java_version(&java.version);
+ validation::is_version_compatible(major, required_major_version, max_major_version)
+ })
}
pub async fn is_java_compatible(
@@ -387,23 +373,13 @@ pub async fn is_java_compatible(
required_major_version: Option<u64>,
max_major_version: Option<u32>,
) -> bool {
- let java_path_buf = PathBuf::from(java_path);
- if let Some(java) = validation::check_java_installation(&java_path_buf).await {
- 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
- } else {
- false
- }
+ let java_path_buf = PathBuf::from(java_path);
+ if let Some(java) = validation::check_java_installation(&java_path_buf).await {
+ let major = validation::parse_java_version(&java.version);
+ validation::is_version_compatible(major, required_major_version, max_major_version)
+ } else {
+ false
+ }
}
pub async fn detect_all_java_installations(app_handle: &AppHandle) -> Vec<JavaInstallation> {
diff --git a/src-tauri/src/core/java/priority.rs b/src-tauri/src/core/java/priority.rs
index 98f8b0e..09a61b3 100644
--- a/src-tauri/src/core/java/priority.rs
+++ b/src-tauri/src/core/java/priority.rs
@@ -4,7 +4,6 @@ use super::JavaInstallation;
use crate::core::java::persistence;
use crate::core::java::validation;
-#[allow(dead_code)]
pub async fn resolve_java_for_launch(
app_handle: &AppHandle,
instance_java_override: Option<&str>,
@@ -50,25 +49,11 @@ pub async fn resolve_java_for_launch(
.find(|java| is_version_compatible(java, required_major_version, max_major_version))
}
-#[allow(dead_code)]
fn is_version_compatible(
java: &JavaInstallation,
required_major_version: Option<u64>,
max_major_version: Option<u32>,
) -> 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
+ validation::is_version_compatible(major, required_major_version, max_major_version)
}
diff --git a/src-tauri/src/core/java/providers/adoptium.rs b/src-tauri/src/core/java/providers/adoptium.rs
index 53d1519..aac2bf2 100644
--- a/src-tauri/src/core/java/providers/adoptium.rs
+++ b/src-tauri/src/core/java/providers/adoptium.rs
@@ -171,8 +171,16 @@ impl JavaProvider for AdoptiumProvider {
// Collect all results concurrently
let mut releases = Vec::new();
for task in fetch_tasks {
- if let Ok(Some(release)) = task.await {
- releases.push(release);
+ match task.await {
+ Ok(Some(release)) => {
+ releases.push(release);
+ }
+ Ok(None) => {
+ // Task completed but returned None, should not happen in current implementation
+ }
+ Err(e) => {
+ eprintln!("AdoptiumProvider::fetch_catalog task join error: {:?}", e);
+ }
}
}
diff --git a/src-tauri/src/core/java/validation.rs b/src-tauri/src/core/java/validation.rs
index cfe6f14..e086e74 100644
--- a/src-tauri/src/core/java/validation.rs
+++ b/src-tauri/src/core/java/validation.rs
@@ -1,3 +1,4 @@
+use std::collections::HashMap;
use std::path::PathBuf;
use std::process::Command;
@@ -86,24 +87,62 @@ pub fn extract_architecture(version_output: &str) -> String {
pub fn extract_vendor(version_output: &str) -> String {
let lower = version_output.to_lowercase();
- // TODO: Expand with more vendors as needed
- if lower.contains("temurin") || lower.contains("adoptium") {
- "Eclipse Adoptium".to_string()
- } else if lower.contains("openjdk") {
- "OpenJDK".to_string()
- } else if lower.contains("oracle") {
- "Oracle".to_string()
- } else if lower.contains("microsoft") {
- "Microsoft".to_string()
- } else if lower.contains("zulu") {
- "Azul Zulu".to_string()
- } else if lower.contains("corretto") {
- "Amazon Corretto".to_string()
- } else if lower.contains("liberica") {
- "BellSoft Liberica".to_string()
- } else if lower.contains("graalvm") {
- "GraalVM".to_string()
- } else {
- "Unknown".to_string()
+ let vendor_name: HashMap<&str, &str> = [
+ // Eclipse/Adoptium
+ ("temurin", "Temurin (Eclipse)"),
+ ("adoptium", "Eclipse Adoptium"),
+ // Amazon
+ ("corretto", "Corretto (Amazon)"),
+ ("amzn", "Corretto (Amazon)"),
+ // Alibaba
+ ("dragonwell", "Dragonwell (Alibaba)"),
+ ("albba", "Dragonwell (Alibaba)"),
+ // GraalVM
+ ("graalvm", "GraalVM"),
+ // Oracle
+ ("oracle", "Java SE Development Kit (Oracle)"),
+ // Tencent
+ ("kona", "Kona (Tencent)"),
+ // BellSoft
+ ("liberica", "Liberica (Bellsoft)"),
+ ("mandrel", "Mandrel (Red Hat)"),
+ // Microsoft
+ ("microsoft", "OpenJDK (Microsoft)"),
+ // SAP
+ ("sapmachine", "SapMachine (SAP)"),
+ // IBM
+ ("semeru", "Semeru (IBM)"),
+ ("sem", "Semeru (IBM)"),
+ // Azul
+ ("zulu", "Zulu (Azul Systems)"),
+ // Trava
+ ("trava", "Trava (Trava)"),
+ // Huawei
+ ("bisheng", "BiSheng (Huawei)"),
+ // Generic OpenJDK
+ ("openjdk", "OpenJDK"),
+ ]
+ .iter()
+ .cloned()
+ .collect();
+
+ for (key, name) in vendor_name {
+ if lower.contains(key) {
+ return name.to_string();
+ }
}
+
+ "Unknown".to_string()
+}
+
+pub fn is_version_compatible(
+ major: u32,
+ required_major_version: Option<u64>,
+ max_major_version: Option<u32>,
+) -> bool {
+ let meets_min = required_major_version
+ .map(|r| major >= r as u32)
+ .unwrap_or(true);
+ let meets_max = max_major_version.map(|m| major <= m).unwrap_or(true);
+ meets_min && meets_max
}