package ru.hflabs.rcd;
import lombok.Getter;
import ru.hflabs.util.io.IOUtils;
import java.io.File;
/**
* Класс <class>Directories</class> содержит информацию об используемых внешних директориях
*
* @see System#getProperty(String)
*/
@Getter
public final class Directories {
/** Корневая директория */
public static final Directories ROOT_FOLDER = retrieveDirectoryByRelativeDirectory(null, "rcd", "rcd.root.folder", "RCD root directory", null);
/** Директория хранения внеменных данных */
public static final Directories TMP_FOLDER = retrieveDirectoryByRelativeDirectory(ROOT_FOLDER, "tmp", "rcd.tmp.folder", "RCD tmp directory", System.getProperty("java.io.tmpdir"));
/** Директория с исходными динамическими классами */
public static final Directories RUNTIME_FOLDER_SOURCE = retrieveDirectoryByRelativeDirectory(null, "runtime", "rcd.runtime.folder.source", "RCD runtime sources directory", null);
/** Директория скомпилированных классов */
public static final Directories RUNTIME_FOLDER_COMPILED = retrieveDirectoryByRelativeDirectory(null, "runtime", "rcd.runtime.folder.compiled", "RCD runtime compiled code directory", null);
/** Директория с конфигурационными параметрами */
public static final Directories PROPERTIES_FOLDER = retrieveDirectoryByRelativeDirectory(ROOT_FOLDER, "conf", "rcd.conf.folder", "RCD configuration directory", null);
/** Директория хранения данных */
public static final Directories STORAGE_FOLDER = retrieveDirectoryByRelativeDirectory(ROOT_FOLDER, "storage", "rcd.storage.folder", "RCD storage directory", null);
/** Ключ JVM */
public final String key;
/** Описание директории */
public final String description;
/** Путь к директории */
public final File location;
/**
* @param key ключ JVM
* @param description описание директории
* @param location путь к директории
*/
public Directories(String key, String description, File location) {
this.key = key;
this.description = description;
this.location = location;
}
/**
* Создает и возвращает относительную директорию по принциму:<br/>
* <ul>
* <li>Если в параметрах JVM указан ключ - то создать директорию по этому ключу</li>
* <li>Если в параметрах JVM не указан ключ - то создать директорию относительно родительско с указанными названием</li>
* <li>Если в параметрах JVM не указан ключ и относительная директория - то создать директорию со значением по умолчанию</li>
* </ul>
*
* @param directory относительная директория
* @param defaultName название директории по умолчанию
* @param key ключ JVM
* @param description описание директории
* @return Возвращает относительную директорию
*/
public static Directories retrieveDirectoryByRelativeDirectory(Directories directory, String defaultName, String key, String description, String defaultValue) {
// Получаем ключ, который указан принудительно
String location = System.getProperty(key);
// Если принудительный ключ не задан, то используем относительный или умолчательный
if (location == null) {
location = (directory != null && directory.location != null) ?
new File(directory.location, defaultName).getAbsolutePath() :
defaultValue;
}
// Создаем и возвращаем внешнюю директорию
return new Directories(key, description, IOUtils.getFolder(location, true));
}
}