mirror of
https://github.com/Frooodle/Stirling-PDF.git
synced 2025-04-03 01:17:18 +02:00
139 lines
5.7 KiB
Java
139 lines
5.7 KiB
Java
package stirling.software.SPDF.config;
|
|
|
|
import java.io.FileNotFoundException;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.net.URISyntaxException;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.nio.file.Paths;
|
|
import java.util.List;
|
|
|
|
import org.springframework.context.ApplicationContextInitializer;
|
|
import org.springframework.context.ConfigurableApplicationContext;
|
|
|
|
public class ConfigInitializer
|
|
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
|
|
|
|
@Override
|
|
public void initialize(ConfigurableApplicationContext applicationContext) {
|
|
try {
|
|
ensureConfigExists();
|
|
} catch (Exception e) {
|
|
throw new RuntimeException("Failed to initialize application configuration", e);
|
|
}
|
|
}
|
|
|
|
public void ensureConfigExists() throws IOException, URISyntaxException {
|
|
// Define the path to the external config directory
|
|
Path destPath = Paths.get("configs", "settings.yml");
|
|
|
|
// Check if the file already exists
|
|
if (Files.notExists(destPath)) {
|
|
// Ensure the destination directory exists
|
|
Files.createDirectories(destPath.getParent());
|
|
|
|
// Copy the resource from classpath to the external directory
|
|
try (InputStream in =
|
|
getClass().getClassLoader().getResourceAsStream("settings.yml.template")) {
|
|
if (in != null) {
|
|
Files.copy(in, destPath);
|
|
} else {
|
|
throw new FileNotFoundException(
|
|
"Resource file not found: settings.yml.template");
|
|
}
|
|
}
|
|
} else {
|
|
// Path templatePath =
|
|
// Paths.get(
|
|
// getClass()
|
|
// .getClassLoader()
|
|
// .getResource("settings.yml.template")
|
|
// .toURI());
|
|
// Path userPath = Paths.get("configs", "settings.yml");
|
|
//
|
|
// List<String> templateLines = Files.readAllLines(templatePath);
|
|
// List<String> userLines =
|
|
// Files.exists(userPath) ? Files.readAllLines(userPath) : new
|
|
// ArrayList<>();
|
|
//
|
|
// List<String> resultLines = new ArrayList<>();
|
|
// int position = 0;
|
|
// for (String templateLine : templateLines) {
|
|
// // Check if the line is a comment
|
|
// if (templateLine.trim().startsWith("#")) {
|
|
// String entry = templateLine.trim().substring(1).trim();
|
|
// if (!entry.isEmpty()) {
|
|
// // Check if this comment has been uncommented in userLines
|
|
// String key = entry.split(":")[0].trim();
|
|
// addLine(resultLines, userLines, templateLine, key, position);
|
|
// } else {
|
|
// resultLines.add(templateLine);
|
|
// }
|
|
// }
|
|
// // Check if the line is a key-value pair
|
|
// else if (templateLine.contains(":")) {
|
|
// String key = templateLine.split(":")[0].trim();
|
|
// addLine(resultLines, userLines, templateLine, key, position);
|
|
// }
|
|
// // Handle empty lines
|
|
// else if (templateLine.trim().length() == 0) {
|
|
// resultLines.add("");
|
|
// }
|
|
// position++;
|
|
// }
|
|
//
|
|
// // Write the result to the user settings file
|
|
// Files.write(userPath, resultLines);
|
|
}
|
|
|
|
Path customSettingsPath = Paths.get("configs", "custom_settings.yml");
|
|
if (!Files.exists(customSettingsPath)) {
|
|
Files.createFile(customSettingsPath);
|
|
}
|
|
}
|
|
|
|
// TODO check parent value instead of just indent lines for duplicate keys (like enabled etc)
|
|
private static void addLine(
|
|
List<String> resultLines,
|
|
List<String> userLines,
|
|
String templateLine,
|
|
String key,
|
|
int position) {
|
|
boolean added = false;
|
|
int templateIndentationLevel = getIndentationLevel(templateLine);
|
|
int pos = 0;
|
|
for (String settingsLine : userLines) {
|
|
if (settingsLine.trim().startsWith(key + ":") && position == pos) {
|
|
int settingsIndentationLevel = getIndentationLevel(settingsLine);
|
|
// Check if it is correct settingsLine and has the same parent as templateLine
|
|
if (settingsIndentationLevel == templateIndentationLevel) {
|
|
resultLines.add(settingsLine);
|
|
added = true;
|
|
break;
|
|
}
|
|
}
|
|
pos++;
|
|
}
|
|
if (!added) {
|
|
resultLines.add(templateLine);
|
|
}
|
|
}
|
|
|
|
private static int getIndentationLevel(String line) {
|
|
int indentationLevel = 0;
|
|
String trimmedLine = line.trim();
|
|
if (trimmedLine.startsWith("#")) {
|
|
line = trimmedLine.substring(1);
|
|
}
|
|
for (char c : line.toCharArray()) {
|
|
if (c == ' ') {
|
|
indentationLevel++;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
return indentationLevel;
|
|
}
|
|
}
|