Skip to content

Commit ddbaea9

Browse files
committed
Don't set jdt compiler/compliance versions in Eclipse plugin
Remove jdt compiler/compliance version preference and update `ProjectSettingsFiles` to keep existing values. Closes gh-278
1 parent 69aa7d1 commit ddbaea9

File tree

4 files changed

+96
-9
lines changed

4 files changed

+96
-9
lines changed

spring-javaformat-eclipse/io.spring.javaformat.eclipse.tests/src/io/spring/javaformat/eclipse/projectsettings/ProjectPropertiesTests.java

-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ public void getModifiedContentReplacesCopyrightYear() throws IOException {
8585
ProjectSettingsFile prefs = getFile(files, "org.eclipse.jdt.ui.prefs");
8686
String content = loadContent(properties.getModifiedContent(prefs).getContent(JavaFormatConfig.DEFAULT));
8787
assertThat(content).contains("Copyright " + year + " the original author or authors");
88-
8988
}
9089

9190
private ProjectSettingsFile getFile(ProjectSettingsFiles files, String name) {

spring-javaformat-eclipse/io.spring.javaformat.eclipse.tests/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFilesTests.java

+44-4
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,13 @@
1616

1717
package io.spring.javaformat.eclipse.projectsettings;
1818

19+
import java.io.ByteArrayInputStream;
20+
import java.io.ByteArrayOutputStream;
1921
import java.io.File;
22+
import java.io.IOException;
2023
import java.io.InputStream;
24+
import java.nio.charset.StandardCharsets;
25+
import java.nio.file.Files;
2126
import java.util.Collections;
2227

2328
import org.eclipse.core.resources.IFile;
@@ -28,8 +33,11 @@
2833

2934
import static org.assertj.core.api.Assertions.assertThat;
3035
import static org.mockito.ArgumentMatchers.any;
36+
import static org.mockito.ArgumentMatchers.anyBoolean;
37+
import static org.mockito.ArgumentMatchers.anyInt;
3138
import static org.mockito.ArgumentMatchers.eq;
3239
import static org.mockito.BDDMockito.given;
40+
import static org.mockito.BDDMockito.will;
3341
import static org.mockito.Mockito.mock;
3442
import static org.mockito.Mockito.verify;
3543

@@ -51,18 +59,50 @@ public void iteratorIteratesFiles() throws Exception {
5159
}
5260

5361
@Test
54-
public void applyToProjectCopiesToDotSettings() throws Exception {
55-
File prefsFile = new File(this.temp, "foo.prefs");
56-
prefsFile.createNewFile();
57-
ProjectSettingsFile file = ProjectSettingsFile.fromFile(prefsFile);
62+
public void applyToProjectWithoutFileCopiesToDotSettings() throws Exception {
63+
ProjectSettingsFile file = createPrefsFile();
64+
ProjectSettingsFiles files = new ProjectSettingsFiles(Collections.singleton(file), new ProjectProperties());
65+
IProject project = mock(IProject.class);
66+
IProgressMonitor monitor = mock(IProgressMonitor.class);
67+
IFile projectFile = mock(IFile.class);
68+
given(project.getFile(".settings/foo.prefs")).willReturn(projectFile);
69+
given(projectFile.exists()).willReturn(false);
70+
ByteArrayOutputStream out = new ByteArrayOutputStream();
71+
will((invocation) -> {
72+
invocation.getArgument(0, InputStream.class).transferTo(out);
73+
return null;
74+
}).given(projectFile).create(any(), anyBoolean(), any());
75+
files.applyToProject(project, monitor);
76+
verify(projectFile).create(any(), eq(true), any());
77+
assertThat(out.toString(StandardCharsets.UTF_8)).isEqualTo("y=z\n");
78+
}
79+
80+
@Test
81+
public void applyToProjectWithFileMergesToDotSettings() throws Exception {
82+
ProjectSettingsFile file = createPrefsFile();
5883
ProjectSettingsFiles files = new ProjectSettingsFiles(Collections.singleton(file), new ProjectProperties());
5984
IProject project = mock(IProject.class);
6085
IProgressMonitor monitor = mock(IProgressMonitor.class);
6186
IFile projectFile = mock(IFile.class);
6287
given(project.getFile(".settings/foo.prefs")).willReturn(projectFile);
6388
given(projectFile.exists()).willReturn(true);
89+
given(projectFile.getContents(true))
90+
.willReturn(new ByteArrayInputStream("a=b\n".getBytes(StandardCharsets.UTF_8)));
91+
ByteArrayOutputStream out = new ByteArrayOutputStream();
92+
will((invocation) -> {
93+
invocation.getArgument(0, InputStream.class).transferTo(out);
94+
return null;
95+
}).given(projectFile).setContents((InputStream) any(), anyInt(), any());
6496
files.applyToProject(project, monitor);
6597
verify(projectFile).setContents((InputStream) any(), eq(1), eq(monitor));
98+
assertThat(out.toString(StandardCharsets.UTF_8)).isEqualTo("a=b\ny=z\n");
99+
}
100+
101+
private ProjectSettingsFile createPrefsFile() throws IOException {
102+
File prefsFile = new File(this.temp, "foo.prefs");
103+
Files.copy(new ByteArrayInputStream("y=z\n".getBytes(StandardCharsets.UTF_8)), prefsFile.toPath());
104+
ProjectSettingsFile file = ProjectSettingsFile.fromFile(prefsFile);
105+
return file;
66106
}
67107

68108
}

spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/projectsettings/ProjectSettingsFiles.java

+52-1
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,22 @@
1717
package io.spring.javaformat.eclipse.projectsettings;
1818

1919
import java.io.BufferedInputStream;
20+
import java.io.ByteArrayInputStream;
21+
import java.io.ByteArrayOutputStream;
2022
import java.io.File;
2123
import java.io.IOException;
2224
import java.io.InputStream;
25+
import java.nio.charset.StandardCharsets;
2326
import java.util.ArrayList;
2427
import java.util.Collection;
28+
import java.util.Comparator;
2529
import java.util.Iterator;
2630
import java.util.List;
31+
import java.util.Map;
32+
import java.util.Map.Entry;
33+
import java.util.Properties;
34+
import java.util.Set;
35+
import java.util.TreeSet;
2736

2837
import org.eclipse.core.resources.IFile;
2938
import org.eclipse.core.resources.IProject;
@@ -77,12 +86,30 @@ public void applyToProject(IProject project, IProgressMonitor monitor) throws IO
7786
destination.create(new BufferedInputStream(content), true, monitor);
7887
}
7988
else {
80-
destination.setContents(new BufferedInputStream(content), IResource.FORCE, monitor);
89+
Properties properties = new OrderedProperties();
90+
try (InputStream existingContent = destination.getContents(true)) {
91+
if (existingContent != null) {
92+
properties.load(existingContent);
93+
}
94+
}
95+
properties.load(content);
96+
destination.setContents(
97+
new ByteArrayInputStream(stripTimestamp(properties).getBytes(StandardCharsets.UTF_8)),
98+
IResource.FORCE, monitor);
8199
}
82100
}
83101
}
84102
}
85103

104+
private String stripTimestamp(Properties properties) throws IOException {
105+
try (ByteArrayOutputStream output = new ByteArrayOutputStream()) {
106+
properties.store(output, null);
107+
String string = output.toString(StandardCharsets.UTF_8);
108+
String separator = System.getProperty("line.separator");
109+
return string.substring(string.indexOf(separator) + separator.length());
110+
}
111+
}
112+
86113
private JavaFormatConfig getJavaFormatConfig(IProject project) {
87114
try {
88115
IPath location = project.getLocation();
@@ -94,4 +121,28 @@ private JavaFormatConfig getJavaFormatConfig(IProject project) {
94121
}
95122
}
96123

124+
static class OrderedProperties extends Properties {
125+
126+
private static final long serialVersionUID = 1L;
127+
128+
@Override
129+
public Set<Map.Entry<Object, Object>> entrySet() {
130+
Set<Map.Entry<Object, Object>> set = new TreeSet<Map.Entry<Object, Object>>(new MapEntryKeyComparator());
131+
set.addAll(super.entrySet());
132+
return set;
133+
};
134+
135+
}
136+
137+
private static class MapEntryKeyComparator implements Comparator<Map.Entry<Object, Object>> {
138+
139+
@Override
140+
public int compare(Entry<Object, Object> o1, Entry<Object, Object> o2) {
141+
Object k1 = o1.getKey();
142+
Object k2 = o2.getKey();
143+
return String.valueOf(k1).compareTo(String.valueOf(k2));
144+
}
145+
146+
}
147+
97148
}

spring-javaformat-eclipse/io.spring.javaformat.eclipse/src/io/spring/javaformat/eclipse/projectsettings/org.eclipse.jdt.core.prefs

-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
1111
org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
1212
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
1313
org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
14-
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
1514
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
16-
org.eclipse.jdt.core.compiler.compliance=1.8
1715
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
1816
org.eclipse.jdt.core.compiler.debug.localVariable=generate
1917
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -104,7 +102,6 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
104102
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
105103
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
106104
org.eclipse.jdt.core.compiler.processAnnotations=disabled
107-
org.eclipse.jdt.core.compiler.source=1.8
108105
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
109106
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
110107
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16

0 commit comments

Comments
 (0)