diff --git a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java b/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java index 394baeb1..e82e8f3f 100644 --- a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java +++ b/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java @@ -61,12 +61,34 @@ public class ConfigInitializer List userLines = Files.exists(userPath) ? Files.readAllLines(userPath) : new ArrayList<>(); - Map templateEntries = extractEntries(templateLines); - Map userEntries = extractEntries(userLines); + List resultLines = new ArrayList<>(); - List mergedLines = mergeConfigs(templateLines, templateEntries, userEntries); - mergedLines = cleanInvalidYamlEntries(mergedLines); - Files.write(userPath, mergedLines); + 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(); + System.out.println("key=" + key + ", entry=" + entry ); + addLine(resultLines, userLines, templateLine, key); + } 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); + } + // Handle empty lines + else if (templateLine.trim().length() == 0) { + resultLines.add(""); + } + } + + // Write the result to the user settings file + Files.write(userPath, resultLines); } Path customSettingsPath = Paths.get("configs", "custom_settings.yml"); @@ -74,129 +96,43 @@ public class ConfigInitializer Files.createFile(customSettingsPath); } } - - private static Map extractEntries(List lines) { - Map entries = new HashMap<>(); - StringBuilder currentEntry = new StringBuilder(); - String currentKey = null; - int blockIndent = -1; - - for (String line : lines) { - if (line.trim().isEmpty()) { - if (currentKey != null) { - currentEntry.append(line).append("\n"); + + + + //TODO check parent value instead of just indent lines for duplicate keys (like enabled etc) + private static void addLine(List resultLines, List userLines, String templateLine, String key) { + boolean added = false; + int templateIndentationLevel = getIndentationLevel(templateLine); + for (String settingsLine : userLines) { + if(settingsLine.contains("oauth2") || settingsLine.contains("enabled") ) + if (settingsLine.trim().startsWith(key + ":")) { + 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; } - continue; - } - - int indentLevel = getIndentationLevel(line); - if (line.trim().startsWith("#")) { - if (indentLevel <= blockIndent || blockIndent == -1) { - if (currentKey != null) { - entries.put(currentKey, currentEntry.toString().trim()); - currentEntry = new StringBuilder(); - } - currentKey = line.trim().replaceAll("#", "").split(":")[0].trim(); - blockIndent = indentLevel; - } - currentEntry.append(line).append("\n"); - } else if (indentLevel == 0 || indentLevel <= blockIndent) { - if (currentKey != null) { - entries.put(currentKey, currentEntry.toString().trim()); - currentEntry = new StringBuilder(); - } - currentKey = line.split(":")[0].trim(); - blockIndent = indentLevel; - currentEntry.append(line).append("\n"); - } else { - currentEntry.append(line).append("\n"); } } - - if (currentKey != null) { - entries.put(currentKey, currentEntry.toString().trim()); + if (!added) { + resultLines.add(templateLine); } - - return entries; - } - - private static List mergeConfigs( - List templateLines, - Map templateEntries, - Map userEntries) { - List mergedLines = new ArrayList<>(); - Set handledKeys = new HashSet<>(); - - String currentBlockKey = null; - int blockIndent = -1; - - for (String line : templateLines) { - if (line.trim().isEmpty()) { - mergedLines.add(line); - continue; - } - - int indentLevel = getIndentationLevel(line); - if (indentLevel == 0 || (indentLevel <= blockIndent && !line.trim().startsWith("#"))) { - currentBlockKey = line.split(":")[0].trim(); - blockIndent = indentLevel; - } - - if (userEntries.containsKey(currentBlockKey) - && !handledKeys.contains(currentBlockKey)) { - mergedLines.add(userEntries.get(currentBlockKey)); - handledKeys.add(currentBlockKey); - } else if (!handledKeys.contains(currentBlockKey)) { - mergedLines.add(line); - } - } - - return mergedLines; - } - - private static List cleanInvalidYamlEntries(List lines) { - List cleanedLines = new ArrayList<>(); - for (int i = 0; i < lines.size(); i++) { - String line = lines.get(i); - String trimmedLine = line.trim(); - - if (trimmedLine.startsWith("#") - || !trimmedLine.endsWith(":") - || trimmedLine.contains(" ")) { - cleanedLines.add(line); - continue; - } - - if (isKeyWithoutChildrenOrValue(i, lines)) { - continue; - } - - cleanedLines.add(line); - } - return cleanedLines; - } - - private static boolean isKeyWithoutChildrenOrValue(int currentIndex, List lines) { - if (currentIndex + 1 < lines.size()) { - String currentLine = lines.get(currentIndex); - String nextLine = lines.get(currentIndex + 1); - int currentIndentation = getIndentationLevel(currentLine); - int nextIndentation = getIndentationLevel(nextLine); - - // If the next line is less or equally indented, it's not a child or value - return nextIndentation <= currentIndentation; - } - - // If it's the last line, then it definitely has no children or value - return true; - } + } private static int getIndentationLevel(String line) { - int count = 0; - for (char ch : line.toCharArray()) { - if (ch == ' ') count++; - else break; + int indentationLevel = 0; + String trimmedLine = line.trim(); + if (trimmedLine.startsWith("#")) { + line = trimmedLine.substring(1); } - return count; + for (char c : line.toCharArray()) { + if (c == ' ') { + indentationLevel++; + } else { + break; + } + } + return indentationLevel; } }