diff --git a/spring-javaformat-eclipse/io.spring.javaformat.eclipse.tests/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFileTests.java b/spring-javaformat-eclipse/io.spring.javaformat.eclipse.tests/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFileTests.java index 769226b6..12a8d90b 100644 --- a/spring-javaformat-eclipse/io.spring.javaformat.eclipse.tests/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFileTests.java +++ b/spring-javaformat-eclipse/io.spring.javaformat.eclipse.tests/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFileTests.java @@ -19,7 +19,9 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileNotFoundException; +import java.io.InputStream; import java.io.PrintWriter; +import java.util.Properties; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -32,6 +34,7 @@ * Tests for {@link ProjectSettingsFile}. * * @author Phillip Webb + * @author Venkata Naga Sai Srikanth Gollapudi */ public class ProjectSettingsFileTests { @@ -56,6 +59,25 @@ void fromClasspathResourceAdaptsResource() throws Exception { .hasSameContentAs(new ByteArrayInputStream("test".getBytes())); } + @Test + void mergedWithOverlaysProperties() throws Exception { + File baseFile = new File(this.temp, "base.prefs"); + writeText(baseFile, "a=1\nb=2\n"); + File overlayFile = new File(this.temp, "overlay.prefs"); + writeText(overlayFile, "b=3\nc=4\n"); + ProjectSettingsFile base = ProjectSettingsFile.fromFile(baseFile); + ProjectSettingsFile overlay = ProjectSettingsFile.fromFile(overlayFile); + ProjectSettingsFile merged = base.mergedWith(overlay); + assertThat(merged.getName()).isEqualTo("base.prefs"); + try (InputStream content = merged.getContent(JavaFormatConfig.DEFAULT)) { + Properties properties = new Properties(); + properties.load(content); + assertThat(properties.getProperty("a")).isEqualTo("1"); + assertThat(properties.getProperty("b")).isEqualTo("3"); + assertThat(properties.getProperty("c")).isEqualTo("4"); + } + } + private void writeText(File file, String s) throws FileNotFoundException { try (PrintWriter writer = new PrintWriter(file)) { writer.write(s); diff --git a/spring-javaformat-eclipse/io.spring.javaformat.eclipse.tests/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFilesLocatorTests.java b/spring-javaformat-eclipse/io.spring.javaformat.eclipse.tests/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFilesLocatorTests.java index 26ca3380..0a0a7f14 100644 --- a/spring-javaformat-eclipse/io.spring.javaformat.eclipse.tests/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFilesLocatorTests.java +++ b/spring-javaformat-eclipse/io.spring.javaformat.eclipse.tests/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFilesLocatorTests.java @@ -16,7 +16,6 @@ package io.spring.javaformat.eclipse.projectsettings; -import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -38,6 +37,7 @@ * Tests for {@link ProjectSettingsFilesLocator}. * * @author Phillip Webb + * @author Venkata Naga Sai Srikanth Gollapudi */ public class ProjectSettingsFilesLocatorTests { @@ -63,17 +63,42 @@ void locateSettingsFilesOnlyFindPrefs() throws Exception { @Test void locateSettingsFilesWhenMultipleFoldersFindsInEarliest() throws Exception { File folder1 = new File(this.temp, "1"); - writeFile(folder1, "foo.prefs", "foo1"); + writeFile(folder1, "foo.prefs", "foo=1"); File folder2 = new File(this.temp, "2"); - writeFile(folder2, "foo.prefs", "foo2"); + writeFile(folder2, "foo.prefs", "foo=2"); writeFile(folder2, "org.eclipse.jdt.core.prefs", "core2"); ProjectSettingsFiles files = new ProjectSettingsFilesLocator(folder1, folder2).locateSettingsFiles(); Map found = new LinkedHashMap<>(); files.iterator().forEachRemaining((f) -> found.put(f.getName(), f)); - assertThat(found.get("foo.prefs").getContent(JavaFormatConfig.DEFAULT)) - .hasSameContentAs(new ByteArrayInputStream("foo1".getBytes())); - assertThat(found.get("org.eclipse.jdt.core.prefs").getContent(JavaFormatConfig.DEFAULT)) - .hasSameContentAs(new ByteArrayInputStream("core2".getBytes())); + try (InputStream content = found.get("foo.prefs").getContent(JavaFormatConfig.DEFAULT)) { + Properties properties = new Properties(); + properties.load(content); + assertThat(properties.get("foo")).isEqualTo("1"); + } + } + + @Test + void locateSettingsFilesMergesUserFileWithDefault() throws Exception { + writeFile(this.temp, "org.eclipse.jdt.ui.prefs", "custome.settings=value"); + ProjectSettingsFiles files = new ProjectSettingsFilesLocator(this.temp).locateSettingsFiles(); + ProjectSettingsFile file = get(files, "org.eclipse.jdt.ui.prefs"); + try (InputStream content = file.getContent(JavaFormatConfig.DEFAULT)) { + Properties properties = new Properties(); + properties.load(content); + assertThat(properties.get("custome.settings")).isEqualTo("value"); + } + } + + @Test + void locateSettingsFilesMergesUserOverrideOnTopOfDefault() throws Exception { + writeFile(this.temp, "org.eclipse.jdt.ui.prefs", "org.eclipse.jdt.ui.importorder=com.example"); + ProjectSettingsFiles files = new ProjectSettingsFilesLocator(this.temp).locateSettingsFiles(); + ProjectSettingsFile file = get(files, "org.eclipse.jdt.ui.prefs"); + try (InputStream content = file.getContent(JavaFormatConfig.DEFAULT)) { + Properties properties = new Properties(); + properties.load(content); + assertThat(properties.get("org.eclipse.jdt.ui.importorder")).isEqualTo("com.example"); + } } @Test diff --git a/spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFile.java b/spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFile.java index ec7ef383..1af8982d 100644 --- a/spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFile.java +++ b/spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFile.java @@ -18,6 +18,7 @@ import java.io.BufferedReader; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -25,6 +26,7 @@ import java.io.InputStreamReader; import java.io.StringWriter; import java.nio.charset.StandardCharsets; +import java.util.Properties; import java.util.function.BiFunction; import io.spring.javaformat.config.JavaFormatConfig; @@ -33,6 +35,7 @@ * A project settings file that can be copied to the project {@code .settings} folder. * * @author Phillip Webb + * @author Venkata Naga Sai Srikanth Gollapudi */ final class ProjectSettingsFile { @@ -86,6 +89,31 @@ public ProjectSettingsFile withUpdatedContent(BiFunction { + Properties properties = new Properties(); + try (InputStream base = this.contentSupplier.getContent(javaFormatConfig)) { + properties.load(base); + } + try (InputStream overlayContent = overlay.getContent(javaFormatConfig)) { + properties.load(overlayContent); + } + ByteArrayOutputStream out = new ByteArrayOutputStream(); + properties.store(out, null); + String result = out.toString(StandardCharsets.UTF_8); + String separator = System.getProperty("line.separator"); + result = result.substring(result.indexOf(separator) + separator.length()); + return new ByteArrayInputStream(result.getBytes(StandardCharsets.UTF_8)); + }); + } + /** * Create a new {@link ProjectSettingsFile} instance from the given {@code File}. * @param file the source file diff --git a/spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFilesLocator.java b/spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFilesLocator.java index e5d5f412..034f5758 100644 --- a/spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFilesLocator.java +++ b/spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFilesLocator.java @@ -28,6 +28,7 @@ * Locates project settings files to be applied to projects. * * @author Phillip Webb + * @author Venkata Naga Sai Srikanth Gollapudi */ public class ProjectSettingsFilesLocator { @@ -49,15 +50,24 @@ public ProjectSettingsFilesLocator(Collection searchFolders) { public ProjectSettingsFiles locateSettingsFiles() throws IOException { ProjectProperties projectProperties = new ProjectProperties(); - Map files = new LinkedHashMap<>(); + Map userFiles = new LinkedHashMap<>(); for (File searchFolder : this.searchFolders) { for (String sourceFolder : SOURCE_FOLDERS) { - add(projectProperties, files, new File(searchFolder, sourceFolder)); + add(projectProperties, userFiles, new File(searchFolder, sourceFolder)); } } + Map files = new LinkedHashMap<>(); for (String file : DEFAULT_FILES) { - putIfAbsent(files, getDefaultSettingsFile(file)); + ProjectSettingsFile defaultFile = getDefaultSettingsFile(file); + ProjectSettingsFile userFile = userFiles.remove(defaultFile.getName()); + if (userFile != null) { + files.put(defaultFile.getName(), defaultFile.mergedWith(userFile)); + } + else { + files.put(defaultFile.getName(), defaultFile); + } } + files.putAll(userFiles); return new ProjectSettingsFiles(files.values(), projectProperties); }