Skip to content

Commit 13fbf78

Browse files
authored
Make all steps with JarState serializable (#2039)
2 parents 7118f6a + 5a21446 commit 13fbf78

File tree

16 files changed

+295
-165
lines changed

16 files changed

+295
-165
lines changed

lib/src/main/java/com/diffplug/spotless/antlr4/Antlr4FormatterStep.java

+27-17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016-2020 DiffPlug
2+
* Copyright 2016-2024 DiffPlug
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,44 +15,54 @@
1515
*/
1616
package com.diffplug.spotless.antlr4;
1717

18-
import java.io.IOException;
1918
import java.io.Serializable;
2019
import java.lang.reflect.InvocationTargetException;
2120
import java.lang.reflect.Method;
2221

23-
import com.diffplug.spotless.*;
24-
25-
public class Antlr4FormatterStep {
22+
import com.diffplug.spotless.FormatterFunc;
23+
import com.diffplug.spotless.FormatterStep;
24+
import com.diffplug.spotless.JarState;
25+
import com.diffplug.spotless.Provisioner;
26+
import com.diffplug.spotless.RoundedStep;
27+
import com.diffplug.spotless.ThrowingEx;
2628

29+
public class Antlr4FormatterStep implements RoundedStep {
30+
private static final long serialVersionUID = 1L;
31+
private static final String MAVEN_COORDINATE = "com.khubla.antlr4formatter:antlr4-formatter:";
32+
private static final String DEFAULT_VERSION = "1.2.1";
2733
public static final String NAME = "antlr4Formatter";
2834

29-
private Antlr4FormatterStep() {}
35+
private final JarState.Promised jarState;
3036

31-
private static final String MAVEN_COORDINATE = "com.khubla.antlr4formatter:antlr4-formatter:";
32-
private static final String DEFAULT_VERSION = "1.2.1";
37+
private Antlr4FormatterStep(JarState.Promised jarState) {
38+
this.jarState = jarState;
39+
}
3340

3441
public static FormatterStep create(Provisioner provisioner) {
3542
return create(defaultVersion(), provisioner);
3643
}
3744

3845
public static FormatterStep create(String version, Provisioner provisioner) {
39-
return FormatterStep.createLazy(NAME, () -> new State(version, provisioner), State::createFormat);
46+
return FormatterStep.create(NAME,
47+
new Antlr4FormatterStep(JarState.promise(() -> JarState.from(MAVEN_COORDINATE + version, provisioner))),
48+
Antlr4FormatterStep::equalityState,
49+
State::createFormat);
4050
}
4151

4252
public static String defaultVersion() {
4353
return DEFAULT_VERSION;
4454
}
4555

46-
static final class State implements Serializable {
47-
private static final long serialVersionUID = 1L;
56+
private State equalityState() {
57+
return new State(jarState.get());
58+
}
4859

49-
/**
50-
* The jar that contains the formatter.
51-
*/
52-
final JarState jarState;
60+
private static final class State implements Serializable {
61+
private static final long serialVersionUID = 1L;
62+
private final JarState jarState;
5363

54-
State(String version, Provisioner provisioner) throws IOException {
55-
this.jarState = JarState.from(MAVEN_COORDINATE + version, provisioner);
64+
State(JarState jarState) {
65+
this.jarState = jarState;
5666
}
5767

5868
FormatterFunc createFormat() throws ClassNotFoundException, NoSuchMethodException {

lib/src/main/java/com/diffplug/spotless/generic/Jsr223Step.java

+25-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2021 DiffPlug
2+
* Copyright 2021-2024 DiffPlug
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,35 +19,52 @@
1919
import java.util.Objects;
2020
import java.util.stream.Collectors;
2121

22+
import javax.annotation.Nullable;
2223
import javax.script.ScriptEngine;
2324
import javax.script.ScriptEngineManager;
2425

2526
import com.diffplug.spotless.FormatterFunc;
2627
import com.diffplug.spotless.FormatterStep;
2728
import com.diffplug.spotless.JarState;
2829
import com.diffplug.spotless.Provisioner;
30+
import com.diffplug.spotless.RoundedStep;
2931

30-
public final class Jsr223Step {
31-
// prevent direct instantiation
32-
private Jsr223Step() {}
32+
public final class Jsr223Step implements RoundedStep {
33+
private static final long serialVersionUID = 1L;
34+
@Nullable
35+
private final JarState.Promised jarState;
36+
private final String engine;
37+
private final String script;
3338

34-
public static FormatterStep create(String name, String dependency, CharSequence engine, CharSequence script, Provisioner provisioner) {
39+
private Jsr223Step(@Nullable JarState.Promised jarState, String engine, String script) {
40+
this.jarState = jarState;
41+
this.engine = engine;
42+
this.script = script;
43+
}
44+
45+
public static FormatterStep create(String name, @Nullable String dependency, CharSequence engine, CharSequence script, Provisioner provisioner) {
3546
Objects.requireNonNull(name, "name");
3647
Objects.requireNonNull(engine, "engine");
3748
Objects.requireNonNull(script, "script");
38-
return FormatterStep.createLazy(name,
39-
() -> new State(dependency == null ? null : JarState.from(dependency, provisioner), engine, script),
49+
return FormatterStep.create(name,
50+
new Jsr223Step(dependency == null ? null : JarState.promise(() -> JarState.from(dependency, provisioner)), engine.toString(), script.toString()),
51+
Jsr223Step::equalityState,
4052
State::toFormatter);
4153
}
4254

55+
private State equalityState() {
56+
return new State(jarState == null ? null : jarState.get(), engine, script);
57+
}
58+
4359
private static final class State implements Serializable {
4460
private static final long serialVersionUID = 1L;
4561

62+
@Nullable
4663
private final JarState jarState;
4764
private final String engine;
4865
private final String script;
4966

50-
State(JarState jarState, CharSequence engine, CharSequence script) {
67+
State(@Nullable JarState jarState, CharSequence engine, CharSequence script) {
5168
this.jarState = jarState;
5269
this.engine = engine.toString();
5370
this.script = script.toString();

lib/src/main/java/com/diffplug/spotless/gherkin/GherkinUtilsStep.java

+23-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2021-2023 DiffPlug
2+
* Copyright 2021-2024 DiffPlug
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,7 +15,6 @@
1515
*/
1616
package com.diffplug.spotless.gherkin;
1717

18-
import java.io.IOException;
1918
import java.io.Serializable;
2019
import java.lang.reflect.Constructor;
2120
import java.lang.reflect.InvocationTargetException;
@@ -25,10 +24,21 @@
2524
import com.diffplug.spotless.FormatterStep;
2625
import com.diffplug.spotless.JarState;
2726
import com.diffplug.spotless.Provisioner;
27+
import com.diffplug.spotless.RoundedStep;
2828

29-
public class GherkinUtilsStep {
29+
public class GherkinUtilsStep implements RoundedStep {
30+
private static final long serialVersionUID = 1L;
3031
private static final String MAVEN_COORDINATE = "io.cucumber:gherkin-utils:";
3132
private static final String DEFAULT_VERSION = "8.0.2";
33+
public static final String NAME = "gherkinUtils";
34+
35+
private final JarState.Promised jarState;
36+
private final GherkinUtilsConfig gherkinSimpleConfig;
37+
38+
private GherkinUtilsStep(JarState.Promised jarState, GherkinUtilsConfig gherkinSimpleConfig) {
39+
this.jarState = jarState;
40+
this.gherkinSimpleConfig = gherkinSimpleConfig;
41+
}
3242

3343
public static String defaultVersion() {
3444
return DEFAULT_VERSION;
@@ -37,7 +47,14 @@ public static String defaultVersion() {
3747
public static FormatterStep create(GherkinUtilsConfig gherkinSimpleConfig,
3848
String formatterVersion, Provisioner provisioner) {
3949
Objects.requireNonNull(provisioner, "provisioner cannot be null");
40-
return FormatterStep.createLazy("gherkin", () -> new GherkinUtilsStep.State(gherkinSimpleConfig, formatterVersion, provisioner), GherkinUtilsStep.State::toFormatter);
50+
return FormatterStep.create(NAME,
51+
new GherkinUtilsStep(JarState.promise(() -> JarState.from(MAVEN_COORDINATE + formatterVersion, provisioner)), gherkinSimpleConfig),
52+
GherkinUtilsStep::equalityState,
53+
GherkinUtilsStep.State::toFormatter);
54+
}
55+
56+
private State equalityState() {
57+
return new State(jarState.get(), gherkinSimpleConfig);
4158
}
4259

4360
private static final class State implements Serializable {
@@ -46,9 +63,9 @@ private static final class State implements Serializable {
4663
private final GherkinUtilsConfig gherkinSimpleConfig;
4764
private final JarState jarState;
4865

49-
private State(GherkinUtilsConfig gherkinSimpleConfig, String formatterVersion, Provisioner provisioner) throws IOException {
66+
State(JarState jarState, GherkinUtilsConfig gherkinSimpleConfig) {
67+
this.jarState = jarState;
5068
this.gherkinSimpleConfig = gherkinSimpleConfig;
51-
this.jarState = JarState.from(MAVEN_COORDINATE + formatterVersion, provisioner);
5269
}
5370

5471
FormatterFunc toFormatter() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
@@ -58,8 +75,4 @@ FormatterFunc toFormatter() throws ClassNotFoundException, NoSuchMethodException
5875
return (FormatterFunc) constructor.newInstance(gherkinSimpleConfig);
5976
}
6077
}
61-
62-
private GherkinUtilsStep() {
63-
// cannot be directly instantiated
64-
}
6578
}

lib/src/main/java/com/diffplug/spotless/json/JacksonConfig.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2023 DiffPlug
2+
* Copyright 2023-2024 DiffPlug
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
1919
import java.util.Collections;
2020
import java.util.LinkedHashMap;
2121
import java.util.Map;
22+
import java.util.TreeMap;
2223

2324
/**
2425
* A DTO holding the basic for Jackson-based formatters
@@ -36,7 +37,7 @@ public class JacksonConfig implements Serializable {
3637
DEFAULT_FEATURE_TOGGLES = defaultFeatureToggles;
3738
}
3839

39-
protected Map<String, Boolean> featureToToggle = new LinkedHashMap<>(DEFAULT_FEATURE_TOGGLES);
40+
protected Map<String, Boolean> featureToToggle = new TreeMap<>(DEFAULT_FEATURE_TOGGLES);
4041

4142
public Map<String, Boolean> getFeatureToToggle() {
4243
return Collections.unmodifiableMap(featureToToggle);

lib/src/main/java/com/diffplug/spotless/json/JacksonJsonStep.java

+25-17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2021-2023 DiffPlug
2+
* Copyright 2021-2024 DiffPlug
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -15,7 +15,6 @@
1515
*/
1616
package com.diffplug.spotless.json;
1717

18-
import java.io.IOException;
1918
import java.io.Serializable;
2019
import java.lang.reflect.Constructor;
2120
import java.lang.reflect.InvocationTargetException;
@@ -25,48 +24,57 @@
2524
import com.diffplug.spotless.FormatterStep;
2625
import com.diffplug.spotless.JarState;
2726
import com.diffplug.spotless.Provisioner;
27+
import com.diffplug.spotless.RoundedStep;
2828

2929
/**
3030
* Simple YAML formatter which reformats the file according to Jackson YAMLFactory.
3131
*/
3232
// https://stackoverflow.com/questions/14515994/convert-json-string-to-pretty-print-json-output-using-jackson
33-
public class JacksonJsonStep {
34-
static final String MAVEN_COORDINATE = "com.fasterxml.jackson.core:jackson-databind:";
35-
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
36-
static final String DEFAULT_VERSION = "2.14.2";
33+
public class JacksonJsonStep implements RoundedStep {
34+
private static final long serialVersionUID = 1L;
35+
private static final String MAVEN_COORDINATE = "com.fasterxml.jackson.core:jackson-databind:";
36+
private static final String DEFAULT_VERSION = "2.14.2";
37+
public static final String NAME = "jacksonJson";
3738

38-
private JacksonJsonStep() {}
39+
private final JarState.Promised jarState;
40+
private final JacksonConfig jacksonConfig;
41+
42+
private JacksonJsonStep(JarState.Promised jarState, JacksonConfig jacksonConfig) {
43+
this.jarState = jarState;
44+
this.jacksonConfig = jacksonConfig;
45+
}
3946

4047
public static String defaultVersion() {
4148
return DEFAULT_VERSION;
4249
}
4350

51+
public static FormatterStep create(Provisioner provisioner) {
52+
return create(new JacksonJsonConfig(), defaultVersion(), provisioner);
53+
}
54+
4455
public static FormatterStep create(JacksonJsonConfig jacksonConfig,
4556
String jacksonVersion,
4657
Provisioner provisioner) {
4758
Objects.requireNonNull(provisioner, "provisioner cannot be null");
48-
return FormatterStep.createLazy("json",
49-
() -> new State(jacksonConfig, jacksonVersion, provisioner),
59+
return FormatterStep.create(NAME,
60+
new JacksonJsonStep(JarState.promise(() -> JarState.from(MAVEN_COORDINATE + jacksonVersion, provisioner)), jacksonConfig),
61+
JacksonJsonStep::equalityState,
5062
State::toFormatter);
5163
}
5264

53-
public static FormatterStep create(Provisioner provisioner) {
54-
return create(new JacksonJsonConfig(), defaultVersion(), provisioner);
65+
private State equalityState() {
66+
return new State(jarState.get(), jacksonConfig);
5567
}
5668

5769
private static final class State implements Serializable {
5870
private static final long serialVersionUID = 1L;
5971

6072
private final JacksonConfig jacksonConfig;
61-
6273
private final JarState jarState;
6374

64-
private State(JacksonConfig jacksonConfig,
65-
String jacksonVersion,
66-
Provisioner provisioner) throws IOException {
75+
State(JarState jarState, JacksonConfig jacksonConfig) {
76+
this.jarState = jarState;
6777
this.jacksonConfig = jacksonConfig;
68-
69-
this.jarState = JarState.from(JacksonJsonStep.MAVEN_COORDINATE + jacksonVersion, provisioner);
7078
}
7179

7280
FormatterFunc toFormatter() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,

0 commit comments

Comments
 (0)