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/persistence.rs | 82 ++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src-tauri/src/core/java/persistence.rs (limited to 'src-tauri/src/core/java/persistence.rs') diff --git a/src-tauri/src/core/java/persistence.rs b/src-tauri/src/core/java/persistence.rs new file mode 100644 index 0000000..0932f2e --- /dev/null +++ b/src-tauri/src/core/java/persistence.rs @@ -0,0 +1,82 @@ +use serde::{Deserialize, Serialize}; +use std::path::PathBuf; +use tauri::{AppHandle, Manager}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct JavaConfig { + pub user_defined_paths: Vec, + pub preferred_java_path: Option, + pub last_detection_time: u64, +} + +impl Default for JavaConfig { + fn default() -> Self { + Self { + user_defined_paths: Vec::new(), + preferred_java_path: None, + last_detection_time: 0, + } + } +} + +fn get_java_config_path(app_handle: &AppHandle) -> PathBuf { + app_handle + .path() + .app_data_dir() + .unwrap() + .join("java_config.json") +} + +pub fn load_java_config(app_handle: &AppHandle) -> JavaConfig { + let config_path = get_java_config_path(app_handle); + if !config_path.exists() { + return JavaConfig::default(); + } + + match std::fs::read_to_string(&config_path) { + Ok(content) => serde_json::from_str(&content).unwrap_or_default(), + Err(_) => JavaConfig::default(), + } +} + +pub fn save_java_config(app_handle: &AppHandle, config: &JavaConfig) -> Result<(), String> { + let config_path = get_java_config_path(app_handle); + let content = serde_json::to_string_pretty(config).map_err(|e| e.to_string())?; + std::fs::create_dir_all(config_path.parent().unwrap()).map_err(|e| e.to_string())?; + std::fs::write(&config_path, content).map_err(|e| e.to_string())?; + Ok(()) +} + +pub fn add_user_defined_path(app_handle: &AppHandle, path: String) -> Result<(), String> { + let mut config = load_java_config(app_handle); + if !config.user_defined_paths.contains(&path) { + config.user_defined_paths.push(path); + } + save_java_config(app_handle, &config) +} + +pub fn remove_user_defined_path(app_handle: &AppHandle, path: &str) -> Result<(), String> { + let mut config = load_java_config(app_handle); + config.user_defined_paths.retain(|p| p != path); + save_java_config(app_handle, &config) +} + +pub fn set_preferred_java_path(app_handle: &AppHandle, path: Option) -> Result<(), String> { + let mut config = load_java_config(app_handle); + config.preferred_java_path = path; + save_java_config(app_handle, &config) +} + +pub fn get_preferred_java_path(app_handle: &AppHandle) -> Option { + let config = load_java_config(app_handle); + config.preferred_java_path +} + +pub fn update_last_detection_time(app_handle: &AppHandle) -> Result<(), String> { + let mut config = load_java_config(app_handle); + config.last_detection_time = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs(); + save_java_config(app_handle, &config) +} -- cgit v1.2.3-70-g09d2