package com.svnmanager.util; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.CollectionType; import com.svnmanager.model.Project; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * 配置管理工具类 */ public class ConfigUtil { private static final Logger logger = LoggerFactory.getLogger(ConfigUtil.class); private static final String CONFIG_DIR = System.getProperty("user.home") + File.separator + ".svn-manager"; private static final String PROJECTS_FILE = CONFIG_DIR + File.separator + "projects.json"; private static final ObjectMapper objectMapper = new ObjectMapper(); static { // 确保配置目录存在 try { Path configPath = Paths.get(CONFIG_DIR); if (!Files.exists(configPath)) { Files.createDirectories(configPath); } } catch (IOException e) { logger.error("创建配置目录失败", e); } } /** * 加载项目列表 * * @return 项目列表 */ public static List loadProjects() { File file = new File(PROJECTS_FILE); if (!file.exists()) { logger.info("项目配置文件不存在,返回空列表"); return new ArrayList<>(); } try { CollectionType listType = objectMapper.getTypeFactory() .constructCollectionType(List.class, Project.class); List projects = objectMapper.readValue(file, listType); logger.info("成功加载 {} 个项目", projects.size()); return projects; } catch (IOException e) { logger.error("加载项目配置失败", e); return new ArrayList<>(); } } /** * 保存项目列表 * * @param projects 项目列表 * @return 是否保存成功 */ public static boolean saveProjects(List projects) { File file = new File(PROJECTS_FILE); try { objectMapper.writerWithDefaultPrettyPrinter().writeValue(file, projects); logger.info("成功保存 {} 个项目", projects.size()); return true; } catch (IOException e) { logger.error("保存项目配置失败", e); return false; } } /** * 添加项目 * * @param project 项目 * @return 是否添加成功 */ public static boolean addProject(Project project) { if (project.getId() == null || project.getId().isEmpty()) { project.setId(UUID.randomUUID().toString()); } List projects = loadProjects(); projects.add(project); return saveProjects(projects); } /** * 更新项目 * * @param project 项目 * @return 是否更新成功 */ public static boolean updateProject(Project project) { List projects = loadProjects(); for (int i = 0; i < projects.size(); i++) { if (projects.get(i).getId().equals(project.getId())) { Project existing = projects.get(i); // 密码留空时保留原密码 if (project.getPassword() == null || project.getPassword().isEmpty()) { project.setPassword(existing.getPassword()); } projects.set(i, project); return saveProjects(projects); } } return false; } /** * 删除项目 * * @param projectId 项目ID * @return 是否删除成功 */ public static boolean deleteProject(String projectId) { List projects = loadProjects(); projects.removeIf(p -> p.getId().equals(projectId)); return saveProjects(projects); } /** * 根据ID获取项目 * * @param projectId 项目ID * @return 项目,如果不存在返回null */ public static Project getProjectById(String projectId) { List projects = loadProjects(); return projects.stream() .filter(p -> p.getId().equals(projectId)) .findFirst() .orElse(null); } /** * 获取配置目录路径 * * @return 配置目录路径 */ public static String getConfigDir() { return CONFIG_DIR; } /** * 获取项目配置文件路径 * * @return 项目配置文件路径 */ public static String getProjectsFilePath() { return PROJECTS_FILE; } }