Skip to content

Commit 0257d0b

Browse files
committed
Make the eclipse-based steps round-trip serializable.
1 parent 0def93e commit 0257d0b

File tree

1 file changed

+29
-23
lines changed

1 file changed

+29
-23
lines changed

lib-extra/src/main/java/com/diffplug/spotless/extra/EclipseBasedStepBuilder.java

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@
3333
import com.diffplug.spotless.FormatterStep;
3434
import com.diffplug.spotless.JarState;
3535
import com.diffplug.spotless.Provisioner;
36-
import com.diffplug.spotless.ThrowingEx;
36+
import com.diffplug.spotless.SerializedFunction;
3737

3838
/**
3939
* Generic Eclipse based formatter step {@link State} builder.
4040
*/
4141
public class EclipseBasedStepBuilder {
4242
private final String formatterName;
4343
private final String formatterStepExt;
44-
private final ThrowingEx.Function<State, FormatterFunc> stateToFormatter;
44+
private final SerializedFunction<State, FormatterFunc> stateToFormatter;
4545
private final Provisioner jarProvisioner;
4646
private String formatterVersion;
4747

@@ -63,12 +63,12 @@ public class EclipseBasedStepBuilder {
6363
private Iterable<File> settingsFiles = new ArrayList<>();
6464

6565
/** Initialize valid default configuration, taking latest version */
66-
public EclipseBasedStepBuilder(String formatterName, Provisioner jarProvisioner, ThrowingEx.Function<State, FormatterFunc> stateToFormatter) {
66+
public EclipseBasedStepBuilder(String formatterName, Provisioner jarProvisioner, SerializedFunction<State, FormatterFunc> stateToFormatter) {
6767
this(formatterName, "", jarProvisioner, stateToFormatter);
6868
}
6969

7070
/** Initialize valid default configuration, taking latest version */
71-
public EclipseBasedStepBuilder(String formatterName, String formatterStepExt, Provisioner jarProvisioner, ThrowingEx.Function<State, FormatterFunc> stateToFormatter) {
71+
public EclipseBasedStepBuilder(String formatterName, String formatterStepExt, Provisioner jarProvisioner, SerializedFunction<State, FormatterFunc> stateToFormatter) {
7272
this.formatterName = Objects.requireNonNull(formatterName, "formatterName");
7373
this.formatterStepExt = Objects.requireNonNull(formatterStepExt, "formatterStepExt");
7474
this.jarProvisioner = Objects.requireNonNull(jarProvisioner, "jarProvisioner");
@@ -78,7 +78,11 @@ public EclipseBasedStepBuilder(String formatterName, String formatterStepExt, Pr
7878

7979
/** Returns the FormatterStep (whose state will be calculated lazily). */
8080
public FormatterStep build() {
81-
return FormatterStep.createLazy(formatterName + formatterStepExt, this::get, stateToFormatter);
81+
var roundtrippableState = new EclipseStep(formatterVersion, formatterStepExt, FileSignature.promise(settingsFiles), JarState.promise(() -> {
82+
return JarState.withoutTransitives(dependencies, jarProvisioner);
83+
}));
84+
return FormatterStep.create(formatterName + formatterStepExt, roundtrippableState,
85+
EclipseStep::state, stateToFormatter);
8286
}
8387

8488
/** Set dependencies for the corresponding Eclipse version */
@@ -122,21 +126,23 @@ public void setPreferences(Iterable<File> settingsFiles) {
122126
this.settingsFiles = settingsFiles;
123127
}
124128

125-
/** Creates the state of the configuration. */
126-
EclipseBasedStepBuilder.State get() throws IOException {
127-
/*
128-
* The current use case is tailored for Gradle.
129-
* Gradle calls this method only once per execution
130-
* and compares the State with the one of a previous run
131-
* for incremental building.
132-
* Hence a lazy construction is not required.
133-
*/
134-
return new State(
135-
formatterVersion,
136-
formatterStepExt,
137-
jarProvisioner,
138-
dependencies,
139-
settingsFiles);
129+
static class EclipseStep implements Serializable {
130+
private static final long serialVersionUID = 1;
131+
private final String semanticVersion;
132+
private final String formatterStepExt;
133+
private final FileSignature.Promised settingsPromise;
134+
private final JarState.Promised jarPromise;
135+
136+
EclipseStep(String semanticVersion, String formatterStepExt, FileSignature.Promised settingsPromise, JarState.Promised jarPromise) {
137+
this.semanticVersion = semanticVersion;
138+
this.formatterStepExt = formatterStepExt;
139+
this.settingsPromise = settingsPromise;
140+
this.jarPromise = jarPromise;
141+
}
142+
143+
private State state() {
144+
return new State(semanticVersion, formatterStepExt, jarPromise.get(), settingsPromise.get());
145+
}
140146
}
141147

142148
/**
@@ -155,9 +161,9 @@ public static class State implements Serializable {
155161
private final FileSignature settingsFiles;
156162

157163
/** State constructor expects that all passed items are not modified afterwards */
158-
protected State(String formatterVersion, String formatterStepExt, Provisioner jarProvisioner, List<String> dependencies, Iterable<File> settingsFiles) throws IOException {
159-
this.jarState = JarState.withoutTransitives(dependencies, jarProvisioner);
160-
this.settingsFiles = FileSignature.signAsList(settingsFiles);
164+
protected State(String formatterVersion, String formatterStepExt, JarState jarState, FileSignature settingsFiles) {
165+
this.jarState = jarState;
166+
this.settingsFiles = settingsFiles;
161167
this.formatterStepExt = formatterStepExt;
162168
semanticVersion = convertEclipseVersion(formatterVersion);
163169
}

0 commit comments

Comments
 (0)