fix for config #376

This commit is contained in:
Anthony Stirling 2023-09-24 21:09:34 +01:00
parent af5bbd8838
commit ece00956d9
2 changed files with 99 additions and 71 deletions

View file

@ -8,7 +8,7 @@ plugins {
} }
group = 'stirling.software' group = 'stirling.software'
version = '0.14.2' version = '0.14.3'
sourceCompatibility = '17' sourceCompatibility = '17'
repositories { repositories {

View file

@ -12,6 +12,8 @@ import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ApplicationContextInitializer;
@ -49,7 +51,8 @@ public class ConfigInitializer implements ApplicationContextInitializer<Configur
// If user file exists, we need to merge it with the template from the classpath // If user file exists, we need to merge it with the template from the classpath
List<String> templateLines; List<String> templateLines;
try (InputStream in = getClass().getClassLoader().getResourceAsStream("settings.yml.template")) { try (InputStream in = getClass().getClassLoader().getResourceAsStream("settings.yml.template")) {
templateLines = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)).lines().collect(Collectors.toList()); templateLines = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)).lines()
.collect(Collectors.toList());
} }
mergeYamlFiles(templateLines, destPath, destPath); mergeYamlFiles(templateLines, destPath, destPath);
@ -58,44 +61,69 @@ public class ConfigInitializer implements ApplicationContextInitializer<Configur
public void mergeYamlFiles(List<String> templateLines, Path userFilePath, Path outputPath) throws IOException { public void mergeYamlFiles(List<String> templateLines, Path userFilePath, Path outputPath) throws IOException {
List<String> userLines = Files.readAllLines(userFilePath); List<String> userLines = Files.readAllLines(userFilePath);
List<String> mergedLines = new ArrayList<>(); List<String> mergedLines = new ArrayList<>();
boolean insideAutoGenerated = false; boolean insideAutoGenerated = false;
boolean beforeFirstKey = true;
Function<String, Boolean> isCommented = line -> line.trim().startsWith("#");
Function<String, String> extractKey = line -> {
String[] parts = line.split(":");
return parts.length > 0 ? parts[0].trim().replace("#", "").trim() : "";
};
Set<String> userKeys = userLines.stream().map(extractKey).collect(Collectors.toSet());
for (String line : templateLines) { for (String line : templateLines) {
// Check if we've entered or left the AutomaticallyGenerated section String key = extractKey.apply(line);
if (line.trim().equalsIgnoreCase("AutomaticallyGenerated:")) { if (line.trim().equalsIgnoreCase("AutomaticallyGenerated:")) {
insideAutoGenerated = true; insideAutoGenerated = true;
mergedLines.add(line); mergedLines.add(line);
continue; continue;
} else if (insideAutoGenerated && line.trim().isEmpty()) { } else if (insideAutoGenerated && line.trim().isEmpty()) {
// We have reached the end of the AutomaticallyGenerated section
insideAutoGenerated = false; insideAutoGenerated = false;
mergedLines.add(line); mergedLines.add(line);
continue; continue;
} }
if (insideAutoGenerated) { if (beforeFirstKey && (isCommented.apply(line) || line.trim().isEmpty())) {
// Add lines from user's settings if we are inside AutomaticallyGenerated // Handle top comments and empty lines before the first key.
Optional<String> userAutoGenValue = userLines.stream().filter(l -> l.trim().startsWith(line.split(":")[0].trim())).findFirst(); mergedLines.add(line);
if (userAutoGenValue.isPresent()) {
mergedLines.add(userAutoGenValue.get());
continue; continue;
} }
} else {
// Outside of AutomaticallyGenerated, continue as before if (!key.isEmpty())
if (line.contains(": ")) { beforeFirstKey = false;
String key = line.split(": ")[0].trim();
Optional<String> userValue = userLines.stream().filter(l -> l.trim().startsWith(key)).findFirst(); if (userKeys.contains(key)) {
if (userValue.isPresent()) { // If user has any version (commented or uncommented) of this key, skip the
// template line
Optional<String> userValue = userLines.stream()
.filter(l -> extractKey.apply(l).equalsIgnoreCase(key) && !isCommented.apply(l)).findFirst();
if (userValue.isPresent())
mergedLines.add(userValue.get()); mergedLines.add(userValue.get());
continue; continue;
} }
if (isCommented.apply(line) || line.trim().isEmpty() || !userKeys.contains(key)) {
mergedLines.add(line); // If line is commented, empty or key not present in user's file, retain the
// template line
continue;
} }
mergedLines.add(line); }
// Add any additional uncommented user lines that are not present in the
// template
for (String userLine : userLines) {
String userKey = extractKey.apply(userLine);
boolean isPresentInTemplate = templateLines.stream().map(extractKey)
.anyMatch(templateKey -> templateKey.equalsIgnoreCase(userKey));
if (!isPresentInTemplate && !isCommented.apply(userLine)) {
mergedLines.add(userLine);
} }
} }
Files.write(outputPath, mergedLines, StandardCharsets.UTF_8); Files.write(outputPath, mergedLines, StandardCharsets.UTF_8);
} }
} }