Newer
Older
simple-opds / src / main / java / ru / mcs / sopds / service / SettingsService.java
package ru.mcs.sopds.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Properties;

@Slf4j
@Service
public class SettingsService {

    private final Properties properties;
    private final Path externalConfigPath;

    public SettingsService() {
        this.properties = new Properties();
        this.externalConfigPath = Paths.get("sopds.properties");
        loadSettings();
    }

    public void loadSettings() {
        try {
            // Сначала пробуем загрузить из внешнего файла (рядом с JAR)
            if (Files.exists(externalConfigPath)) {
                try (InputStream input = Files.newInputStream(externalConfigPath)) {
                    properties.load(input);
                    log.info("Настройки загружены из внешнего файла: {}", externalConfigPath.toAbsolutePath());
                }
            } else {
                // Если внешнего файла нет, загружаем из ресурсов
                Resource resource = new ClassPathResource("sopds.properties");
                try (InputStream input = resource.getInputStream()) {
                    properties.load(input);
                    log.info("Настройки загружены из ресурсов");
                }

                // Создаем внешний файл для будущих изменений
                saveSettings();
            }
        } catch (IOException e) {
            log.error("Ошибка при загрузке настроек: {}", e.getMessage());
            setDefaultSettings();
        }
    }

    public void saveSettings() {
        try (OutputStream output = Files.newOutputStream(externalConfigPath)) {
            properties.store(output, "SOPDS Configuration File");
            log.info("Настройки сохранены в файл: {}", externalConfigPath.toAbsolutePath());
        } catch (IOException e) {
            log.error("Ошибка при сохранении настроек: {}", e.getMessage());
        }
    }

    private void setDefaultSettings() {
        properties.setProperty("SOPDS_ALPHABET_MENU", "true");
        properties.setProperty("SOPDS_SCAN_ENABLED", "true");
        properties.setProperty("SOPDS_SCAN_PATH", "books");
        properties.setProperty("SOPDS_PAGE_SIZE", "20");
        properties.setProperty("SOPDS_TITLE", "Simple OPDS Catalog");
        properties.setProperty("SOPDS_LANGUAGE", "ru");
    }

    // Общие методы для работы с настройками
    public String getProperty(String key, String defaultValue) {
        return properties.getProperty(key, defaultValue);
    }

    public void setProperty(String key, String value) {
        properties.setProperty(key, value);
    }

    public boolean getBooleanProperty(String key, boolean defaultValue) {
        String value = properties.getProperty(key);
        if (value != null) {
            return Boolean.parseBoolean(value);
        }
        return defaultValue;
    }

    public int getIntProperty(String key, int defaultValue) {
        String value = properties.getProperty(key);
        if (value != null) {
            try {
                return Integer.parseInt(value);
            } catch (NumberFormatException e) {
                log.warn("Некорректное значение для {}: {}", key, value);
            }
        }
        return defaultValue;
    }

    // Специфичные геттеры и сеттеры для каждой настройки
    public boolean getAlphabetMenu() {
        return getBooleanProperty("SOPDS_ALPHABET_MENU", true);
    }

    public void setAlphabetMenu(boolean value) {
        setProperty("SOPDS_ALPHABET_MENU", String.valueOf(value));
    }

    public boolean getScanEnabled() {
        return getBooleanProperty("SOPDS_SCAN_ENABLED", true);
    }

    public void setScanEnabled(boolean value) {
        setProperty("SOPDS_SCAN_ENABLED", String.valueOf(value));
    }

    public String getScanPath() {
        return getProperty("SOPDS_SCAN_PATH", "books");
    }

    public void setScanPath(String value) {
        setProperty("SOPDS_SCAN_PATH", value);
    }

    public int getPageSize() {
        return getIntProperty("SOPDS_PAGE_SIZE", 20);
    }

    public void setPageSize(int value) {
        setProperty("SOPDS_PAGE_SIZE", String.valueOf(value));
    }

    public String getTitle() {
        return getProperty("SOPDS_TITLE", "Simple OPDS Catalog");
    }

    public void setTitle(String value) {
        setProperty("SOPDS_TITLE", value);
    }

    public String getLanguage() {
        return getProperty("SOPDS_LANGUAGE", "ru");
    }

    public void setLanguage(String value) {
        setProperty("SOPDS_LANGUAGE", value);
    }

    // Метод для получения всех настроек (для отображения)
    public Properties getAllProperties() {
        return new Properties(properties);
    }
}