Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -32,6 +34,7 @@
* Tests for {@link ProjectSettingsFile}.
*
* @author Phillip Webb
* @author Venkata Naga Sai Srikanth Gollapudi
*/
public class ProjectSettingsFileTests {

Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -38,6 +37,7 @@
* Tests for {@link ProjectSettingsFilesLocator}.
*
* @author Phillip Webb
* @author Venkata Naga Sai Srikanth Gollapudi
*/
public class ProjectSettingsFilesLocatorTests {

Expand All @@ -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<String, ProjectSettingsFile> 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
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;
Expand All @@ -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 {

Expand Down Expand Up @@ -86,6 +89,31 @@ public ProjectSettingsFile withUpdatedContent(BiFunction<JavaFormatConfig, Strin
});
}

/**
* Create a new {@link ProjectSettingsFile} where the content of the given overlay is
* merged on top of this files's content. Properties from the overlay will override
* those in this file.
* @param overlay the overlay settings file to merge on top of this file
* @return a new {@link ProjectSettingsFile} instance with merged content
*/
public ProjectSettingsFile mergedWith(ProjectSettingsFile overlay) {
return new ProjectSettingsFile(this.name, (javaFormatConfig) -> {
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -49,15 +50,24 @@ public ProjectSettingsFilesLocator(Collection<File> searchFolders) {

public ProjectSettingsFiles locateSettingsFiles() throws IOException {
ProjectProperties projectProperties = new ProjectProperties();
Map<String, ProjectSettingsFile> files = new LinkedHashMap<>();
Map<String, ProjectSettingsFile> 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<String, ProjectSettingsFile> 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);
}

Expand Down