From f65136dd684711bbd4c1b2bb3b3493f966b48983 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 11 Apr 2022 16:17:42 +0200 Subject: [PATCH] Harmonize the use of Writer rather than Generator --- .../FileNativeConfigurationGenerator.java | 136 ------------------ .../FileNativeConfigurationWriter.java | 86 +++++++++++ ...java => JavaSerializationHintsWriter.java} | 12 +- .../nativex/NativeConfigurationGenerator.java | 36 ----- .../nativex/NativeConfigurationWriter.java | 85 +++++++++++ ...sSerializer.java => ProxyHintsWriter.java} | 12 +- ...alizer.java => ReflectionHintsWriter.java} | 12 +- ...rializer.java => ResourceHintsWriter.java} | 12 +- ...> FileNativeConfigurationWriterTests.java} | 28 ++-- ...=> JavaSerializationHintsWriterTests.java} | 13 +- ...rTests.java => ProxyHintsWriterTests.java} | 13 +- ...s.java => ReflectionHintsWriterTests.java} | 13 +- ...sts.java => ResourceHintsWriterTests.java} | 13 +- 13 files changed, 236 insertions(+), 235 deletions(-) delete mode 100644 spring-core/src/main/java/org/springframework/aot/nativex/FileNativeConfigurationGenerator.java create mode 100644 spring-core/src/main/java/org/springframework/aot/nativex/FileNativeConfigurationWriter.java rename spring-core/src/main/java/org/springframework/aot/nativex/{JavaSerializationHintsSerializer.java => JavaSerializationHintsWriter.java} (81%) delete mode 100644 spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationGenerator.java create mode 100644 spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationWriter.java rename spring-core/src/main/java/org/springframework/aot/nativex/{ProxyHintsSerializer.java => ProxyHintsWriter.java} (84%) rename spring-core/src/main/java/org/springframework/aot/nativex/{ReflectionHintsSerializer.java => ReflectionHintsWriter.java} (94%) rename spring-core/src/main/java/org/springframework/aot/nativex/{ResourceHintsSerializer.java => ResourceHintsWriter.java} (91%) rename spring-core/src/test/java/org/springframework/aot/nativex/{FileNativeConfigurationGeneratorTests.java => FileNativeConfigurationWriterTests.java} (88%) rename spring-core/src/test/java/org/springframework/aot/nativex/{JavaSerializationHintsSerializerTests.java => JavaSerializationHintsWriterTests.java} (83%) rename spring-core/src/test/java/org/springframework/aot/nativex/{ProxyHintsSerializerTests.java => ProxyHintsWriterTests.java} (84%) rename spring-core/src/test/java/org/springframework/aot/nativex/{ReflectionHintsSerializerTests.java => ReflectionHintsWriterTests.java} (94%) rename spring-core/src/test/java/org/springframework/aot/nativex/{ResourceHintsSerializerTests.java => ResourceHintsWriterTests.java} (90%) diff --git a/spring-core/src/main/java/org/springframework/aot/nativex/FileNativeConfigurationGenerator.java b/spring-core/src/main/java/org/springframework/aot/nativex/FileNativeConfigurationGenerator.java deleted file mode 100644 index 8f2f6de3e8e..00000000000 --- a/spring-core/src/main/java/org/springframework/aot/nativex/FileNativeConfigurationGenerator.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2002-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.aot.nativex; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Path; - -import org.springframework.aot.hint.JavaSerializationHints; -import org.springframework.aot.hint.ProxyHints; -import org.springframework.aot.hint.ReflectionHints; -import org.springframework.aot.hint.ResourceHints; -import org.springframework.aot.hint.RuntimeHints; -import org.springframework.lang.Nullable; - -/** - * Generate the GraalVM native configuration files from runtime hints. - * - * @author Sebastien Deleuze - * @since 6.0 - * @see Native Image Build Configuration - */ -public class FileNativeConfigurationGenerator implements NativeConfigurationGenerator { - - private final Path basePath; - - private final String groupId; - - private final String artifactId; - - public FileNativeConfigurationGenerator(Path basePath) { - this(basePath, null, null); - } - - public FileNativeConfigurationGenerator(Path basePath, @Nullable String groupId, @Nullable String artifactId) { - this.basePath = basePath; - if ((groupId == null && artifactId != null) || (groupId != null && artifactId == null)) { - throw new IllegalArgumentException("groupId and artifactId must be both null or both non-null"); - } - this.groupId = groupId; - this.artifactId = artifactId; - } - - @Override - public void generate(RuntimeHints hints) { - try { - if (hints.javaSerialization().types().findAny().isPresent()) { - generateFile(hints.javaSerialization()); - } - if (hints.proxies().jdkProxies().findAny().isPresent()) { - generateFile(hints.proxies()); - } - if (hints.reflection().typeHints().findAny().isPresent()) { - generateFile(hints.reflection()); - } - if (hints.resources().resourcePatterns().findAny().isPresent() || - hints.resources().resourceBundles().findAny().isPresent()) { - generateFile(hints.resources()); - } - } - catch (IOException ex) { - throw new IllegalStateException("Unexpected I/O error while writing the native configuration", ex); - } - } - - /** - * Generate the Java serialization native configuration file. - */ - private void generateFile(JavaSerializationHints hints) throws IOException { - JavaSerializationHintsSerializer serializer = new JavaSerializationHintsSerializer(); - File file = createIfNecessary("serialization-config.json"); - FileWriter writer = new FileWriter(file); - writer.write(serializer.serialize(hints)); - writer.close(); - } - - /** - * Generate the proxy native configuration file. - */ - private void generateFile(ProxyHints hints) throws IOException { - ProxyHintsSerializer serializer = new ProxyHintsSerializer(); - File file = createIfNecessary("proxy-config.json"); - FileWriter writer = new FileWriter(file); - writer.write(serializer.serialize(hints)); - writer.close(); - } - - /** - * Generate the reflection native configuration file. - */ - private void generateFile(ReflectionHints hints) throws IOException { - ReflectionHintsSerializer serializer = new ReflectionHintsSerializer(); - File file = createIfNecessary("reflect-config.json"); - FileWriter writer = new FileWriter(file); - writer.write(serializer.serialize(hints)); - writer.close(); - } - - /** - * Generate the resource native configuration file. - */ - private void generateFile(ResourceHints hints) throws IOException { - ResourceHintsSerializer serializer = new ResourceHintsSerializer(); - File file = createIfNecessary("resource-config.json"); - FileWriter writer = new FileWriter(file); - writer.write(serializer.serialize(hints)); - writer.close(); - } - - private File createIfNecessary(String filename) throws IOException { - Path outputDirectory = this.basePath.resolve("META-INF").resolve("native-image"); - if (this.groupId != null && this.artifactId != null) { - outputDirectory = outputDirectory.resolve(this.groupId).resolve(this.artifactId); - } - outputDirectory.toFile().mkdirs(); - File file = outputDirectory.resolve(filename).toFile(); - file.createNewFile(); - return file; - } - -} diff --git a/spring-core/src/main/java/org/springframework/aot/nativex/FileNativeConfigurationWriter.java b/spring-core/src/main/java/org/springframework/aot/nativex/FileNativeConfigurationWriter.java new file mode 100644 index 00000000000..ae35c5ac634 --- /dev/null +++ b/spring-core/src/main/java/org/springframework/aot/nativex/FileNativeConfigurationWriter.java @@ -0,0 +1,86 @@ +/* + * Copyright 2002-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.aot.nativex; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.nio.file.Path; +import java.util.function.Consumer; + +import org.springframework.lang.Nullable; + +/** + * A {@link NativeConfigurationWriter} implementation that writes the + * configuration to disk. + * + * @author Sebastien Deleuze + * @author Stephane Nicoll + * @since 6.0 + * @see Native Image Build Configuration + */ +public class FileNativeConfigurationWriter extends NativeConfigurationWriter { + + private final Path basePath; + + private final String groupId; + + private final String artifactId; + + public FileNativeConfigurationWriter(Path basePath) { + this(basePath, null, null); + } + + public FileNativeConfigurationWriter(Path basePath, @Nullable String groupId, @Nullable String artifactId) { + this.basePath = basePath; + if ((groupId == null && artifactId != null) || (groupId != null && artifactId == null)) { + throw new IllegalArgumentException("groupId and artifactId must be both null or both non-null"); + } + this.groupId = groupId; + this.artifactId = artifactId; + } + + @Override + protected void writeTo(String fileName, Consumer writer) { + try { + File file = createIfNecessary(fileName); + try (FileWriter out = new FileWriter(file)) { + writer.accept(createJsonWriter(out)); + } + } + catch (IOException ex) { + throw new IllegalStateException("Failed to write native configuration for " + fileName, ex); + } + } + + private File createIfNecessary(String filename) throws IOException { + Path outputDirectory = this.basePath.resolve("META-INF").resolve("native-image"); + if (this.groupId != null && this.artifactId != null) { + outputDirectory = outputDirectory.resolve(this.groupId).resolve(this.artifactId); + } + outputDirectory.toFile().mkdirs(); + File file = outputDirectory.resolve(filename).toFile(); + file.createNewFile(); + return file; + } + + private BasicJsonWriter createJsonWriter(Writer out) { + return new BasicJsonWriter(out); + } + +} diff --git a/spring-core/src/main/java/org/springframework/aot/nativex/JavaSerializationHintsSerializer.java b/spring-core/src/main/java/org/springframework/aot/nativex/JavaSerializationHintsWriter.java similarity index 81% rename from spring-core/src/main/java/org/springframework/aot/nativex/JavaSerializationHintsSerializer.java rename to spring-core/src/main/java/org/springframework/aot/nativex/JavaSerializationHintsWriter.java index 1082e1dce68..cebea99397c 100644 --- a/spring-core/src/main/java/org/springframework/aot/nativex/JavaSerializationHintsSerializer.java +++ b/spring-core/src/main/java/org/springframework/aot/nativex/JavaSerializationHintsWriter.java @@ -16,7 +16,6 @@ package org.springframework.aot.nativex; -import java.io.StringWriter; import java.util.LinkedHashMap; import java.util.Map; @@ -24,7 +23,7 @@ import org.springframework.aot.hint.JavaSerializationHints; import org.springframework.aot.hint.TypeReference; /** - * Serialize a {@link JavaSerializationHints} to the JSON output expected by the + * Write a {@link JavaSerializationHints} to the JSON output expected by the * GraalVM {@code native-image} compiler, typically named * {@code serialization-config.json}. * @@ -33,13 +32,12 @@ import org.springframework.aot.hint.TypeReference; * @since 6.0 * @see Native Image Build Configuration */ -class JavaSerializationHintsSerializer { +class JavaSerializationHintsWriter { - public String serialize(JavaSerializationHints hints) { - StringWriter sw = new StringWriter(); - BasicJsonWriter writer = new BasicJsonWriter(sw, " "); + public static final JavaSerializationHintsWriter INSTANCE = new JavaSerializationHintsWriter(); + + public void write(BasicJsonWriter writer, JavaSerializationHints hints) { writer.writeArray(hints.types().map(this::toAttributes).toList()); - return sw.toString(); } private Map toAttributes(TypeReference typeReference) { diff --git a/spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationGenerator.java b/spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationGenerator.java deleted file mode 100644 index 841794108fb..00000000000 --- a/spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationGenerator.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2002-2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.aot.nativex; - -import org.springframework.aot.hint.RuntimeHints; - -/** - * Generate GraalVM native configuration. - * - * @author Sebastien Deleuze - * @since 6.0 - * @see Native Image Build Configuration - */ -public interface NativeConfigurationGenerator { - - /** - * Generate the GraalVM native configuration from the provided hints. - * @param hints the hints to serialize - */ - void generate(RuntimeHints hints); - -} diff --git a/spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationWriter.java b/spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationWriter.java new file mode 100644 index 00000000000..143f708119f --- /dev/null +++ b/spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationWriter.java @@ -0,0 +1,85 @@ +/* + * Copyright 2002-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.aot.nativex; + +import java.util.function.Consumer; + +import org.springframework.aot.hint.JavaSerializationHints; +import org.springframework.aot.hint.ProxyHints; +import org.springframework.aot.hint.ReflectionHints; +import org.springframework.aot.hint.ResourceHints; +import org.springframework.aot.hint.RuntimeHints; + +/** + * Write {@link RuntimeHints} as GraalVM native configuration. + * + * @author Sebastien Deleuze + * @author Stephane Nicoll + * @since 6.0 + * @see Native Image Build Configuration + */ +public abstract class NativeConfigurationWriter { + + /** + * Write the GraalVM native configuration from the provided hints. + * @param hints the hints to handle + */ + public void write(RuntimeHints hints) { + if (hints.javaSerialization().types().findAny().isPresent()) { + writeJavaSerializationHints(hints.javaSerialization()); + } + if (hints.proxies().jdkProxies().findAny().isPresent()) { + writeProxyHints(hints.proxies()); + } + if (hints.reflection().typeHints().findAny().isPresent()) { + writeReflectionHints(hints.reflection()); + } + if (hints.resources().resourcePatterns().findAny().isPresent() || + hints.resources().resourceBundles().findAny().isPresent()) { + writeResourceHints(hints.resources()); + } + } + + /** + * Write the specified GraalVM native configuration file, using the + * provided {@link BasicJsonWriter}. + * @param fileName the name of the file + * @param writer a consumer for the writer to use + */ + protected abstract void writeTo(String fileName, Consumer writer); + + private void writeJavaSerializationHints(JavaSerializationHints hints) { + writeTo("serialization-config.json", writer -> + JavaSerializationHintsWriter.INSTANCE.write(writer, hints)); + } + + private void writeProxyHints(ProxyHints hints) { + writeTo("proxy-config.json", writer -> + ProxyHintsWriter.INSTANCE.write(writer, hints)); + } + + private void writeReflectionHints(ReflectionHints hints) { + writeTo("reflect-config.json", writer -> + ReflectionHintsWriter.INSTANCE.write(writer, hints)); + } + + private void writeResourceHints(ResourceHints hints) { + writeTo("resource-config.json", writer -> + ResourceHintsWriter.INSTANCE.write(writer, hints)); + } + +} diff --git a/spring-core/src/main/java/org/springframework/aot/nativex/ProxyHintsSerializer.java b/spring-core/src/main/java/org/springframework/aot/nativex/ProxyHintsWriter.java similarity index 84% rename from spring-core/src/main/java/org/springframework/aot/nativex/ProxyHintsSerializer.java rename to spring-core/src/main/java/org/springframework/aot/nativex/ProxyHintsWriter.java index 36f51912d12..9def944c0dd 100644 --- a/spring-core/src/main/java/org/springframework/aot/nativex/ProxyHintsSerializer.java +++ b/spring-core/src/main/java/org/springframework/aot/nativex/ProxyHintsWriter.java @@ -16,7 +16,6 @@ package org.springframework.aot.nativex; -import java.io.StringWriter; import java.util.LinkedHashMap; import java.util.Map; @@ -25,7 +24,7 @@ import org.springframework.aot.hint.ProxyHints; import org.springframework.aot.hint.TypeReference; /** - * Serialize {@link JdkProxyHint}s contained in a {@link ProxyHints} to the JSON + * Write {@link JdkProxyHint}s contained in a {@link ProxyHints} to the JSON * output expected by the GraalVM {@code native-image} compiler, typically named * {@code proxy-config.json}. * @@ -35,13 +34,12 @@ import org.springframework.aot.hint.TypeReference; * @see Dynamic Proxy in Native Image * @see Native Image Build Configuration */ -class ProxyHintsSerializer { +class ProxyHintsWriter { - public String serialize(ProxyHints hints) { - StringWriter sw = new StringWriter(); - BasicJsonWriter writer = new BasicJsonWriter(sw, " "); + public static final ProxyHintsWriter INSTANCE = new ProxyHintsWriter(); + + public void write(BasicJsonWriter writer, ProxyHints hints) { writer.writeArray(hints.jdkProxies().map(this::toAttributes).toList()); - return sw.toString(); } private Map toAttributes(JdkProxyHint hint) { diff --git a/spring-core/src/main/java/org/springframework/aot/nativex/ReflectionHintsSerializer.java b/spring-core/src/main/java/org/springframework/aot/nativex/ReflectionHintsWriter.java similarity index 94% rename from spring-core/src/main/java/org/springframework/aot/nativex/ReflectionHintsSerializer.java rename to spring-core/src/main/java/org/springframework/aot/nativex/ReflectionHintsWriter.java index e3f1dfc30cd..09c8dd09d14 100644 --- a/spring-core/src/main/java/org/springframework/aot/nativex/ReflectionHintsSerializer.java +++ b/spring-core/src/main/java/org/springframework/aot/nativex/ReflectionHintsWriter.java @@ -16,7 +16,6 @@ package org.springframework.aot.nativex; -import java.io.StringWriter; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; @@ -34,7 +33,7 @@ import org.springframework.aot.hint.TypeReference; import org.springframework.lang.Nullable; /** - * Serialize {@link ReflectionHints} to the JSON output expected by the GraalV + * Write {@link ReflectionHints} to the JSON output expected by the GraalVM * {@code native-image} compiler, typically named {@code reflect-config.json}. * * @author Sebastien Deleuze @@ -43,13 +42,12 @@ import org.springframework.lang.Nullable; * @see Reflection Use in Native Images * @see Native Image Build Configuration */ -class ReflectionHintsSerializer { +class ReflectionHintsWriter { - public String serialize(ReflectionHints hints) { - StringWriter sw = new StringWriter(); - BasicJsonWriter writer = new BasicJsonWriter(sw, " "); + public static final ReflectionHintsWriter INSTANCE = new ReflectionHintsWriter(); + + public void write(BasicJsonWriter writer, ReflectionHints hints) { writer.writeArray(hints.typeHints().map(this::toAttributes).toList()); - return sw.toString(); } private Map toAttributes(TypeHint hint) { diff --git a/spring-core/src/main/java/org/springframework/aot/nativex/ResourceHintsSerializer.java b/spring-core/src/main/java/org/springframework/aot/nativex/ResourceHintsWriter.java similarity index 91% rename from spring-core/src/main/java/org/springframework/aot/nativex/ResourceHintsSerializer.java rename to spring-core/src/main/java/org/springframework/aot/nativex/ResourceHintsWriter.java index 9000d8cb39e..0b5f76a2787 100644 --- a/spring-core/src/main/java/org/springframework/aot/nativex/ResourceHintsSerializer.java +++ b/spring-core/src/main/java/org/springframework/aot/nativex/ResourceHintsWriter.java @@ -16,7 +16,6 @@ package org.springframework.aot.nativex; -import java.io.StringWriter; import java.util.Arrays; import java.util.Collection; import java.util.LinkedHashMap; @@ -32,7 +31,7 @@ import org.springframework.aot.hint.ResourcePatternHint; import org.springframework.lang.Nullable; /** - * Serialize a {@link ResourceHints} to the JSON output expected by the GraalVM + * Write a {@link ResourceHints} to the JSON output expected by the GraalVM * {@code native-image} compiler, typically named {@code resource-config.json}. * * @author Sebastien Deleuze @@ -41,16 +40,15 @@ import org.springframework.lang.Nullable; * @see Accessing Resources in Native Images * @see Native Image Build Configuration */ -class ResourceHintsSerializer { +class ResourceHintsWriter { - public String serialize(ResourceHints hints) { - StringWriter out = new StringWriter(); - BasicJsonWriter writer = new BasicJsonWriter(out, "\t"); + public static final ResourceHintsWriter INSTANCE = new ResourceHintsWriter(); + + public void write(BasicJsonWriter writer, ResourceHints hints) { Map attributes = new LinkedHashMap<>(); attributes.put("resources", toAttributes(hints)); handleResourceBundles(attributes, hints.resourceBundles()); writer.writeObject(attributes); - return out.toString(); } private Map toAttributes(ResourceHints hint) { diff --git a/spring-core/src/test/java/org/springframework/aot/nativex/FileNativeConfigurationGeneratorTests.java b/spring-core/src/test/java/org/springframework/aot/nativex/FileNativeConfigurationWriterTests.java similarity index 88% rename from spring-core/src/test/java/org/springframework/aot/nativex/FileNativeConfigurationGeneratorTests.java rename to spring-core/src/test/java/org/springframework/aot/nativex/FileNativeConfigurationWriterTests.java index 626e33aa02d..58d03b9b96b 100644 --- a/spring-core/src/test/java/org/springframework/aot/nativex/FileNativeConfigurationGeneratorTests.java +++ b/spring-core/src/test/java/org/springframework/aot/nativex/FileNativeConfigurationWriterTests.java @@ -45,11 +45,11 @@ import org.springframework.util.MimeType; import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link FileNativeConfigurationGenerator}. + * Tests for {@link FileNativeConfigurationWriter}. * * @author Sebastien Deleuze */ -public class FileNativeConfigurationGeneratorTests { +public class FileNativeConfigurationWriterTests { @TempDir static Path tempDir; @@ -57,19 +57,19 @@ public class FileNativeConfigurationGeneratorTests { @Test void emptyConfig() { Path empty = tempDir.resolve("empty"); - FileNativeConfigurationGenerator generator = new FileNativeConfigurationGenerator(empty); - generator.generate(new RuntimeHints()); + FileNativeConfigurationWriter generator = new FileNativeConfigurationWriter(empty); + generator.write(new RuntimeHints()); assertThat(empty.toFile().listFiles()).isNull(); } @Test void serializationConfig() throws IOException, JSONException { - FileNativeConfigurationGenerator generator = new FileNativeConfigurationGenerator(tempDir); + FileNativeConfigurationWriter generator = new FileNativeConfigurationWriter(tempDir); RuntimeHints hints = new RuntimeHints(); JavaSerializationHints serializationHints = hints.javaSerialization(); serializationHints.registerType(Integer.class); serializationHints.registerType(Long.class); - generator.generate(hints); + generator.write(hints); assertEquals(""" [ { "name": "java.lang.Integer" }, @@ -79,12 +79,12 @@ public class FileNativeConfigurationGeneratorTests { @Test void proxyConfig() throws IOException, JSONException { - FileNativeConfigurationGenerator generator = new FileNativeConfigurationGenerator(tempDir); + FileNativeConfigurationWriter generator = new FileNativeConfigurationWriter(tempDir); RuntimeHints hints = new RuntimeHints(); ProxyHints proxyHints = hints.proxies(); proxyHints.registerJdkProxy(Function.class); proxyHints.registerJdkProxy(Function.class, Consumer.class); - generator.generate(hints); + generator.write(hints); assertEquals(""" [ { "interfaces": [ "java.util.function.Function" ] }, @@ -94,7 +94,7 @@ public class FileNativeConfigurationGeneratorTests { @Test void reflectionConfig() throws IOException, JSONException { - FileNativeConfigurationGenerator generator = new FileNativeConfigurationGenerator(tempDir); + FileNativeConfigurationWriter generator = new FileNativeConfigurationWriter(tempDir); RuntimeHints hints = new RuntimeHints(); ReflectionHints reflectionHints = hints.reflection(); reflectionHints.registerType(StringDecoder.class, builder -> { @@ -117,7 +117,7 @@ public class FileNativeConfigurationGeneratorTests { .withMethod("getDefaultCharset", Collections.emptyList(), constructorHint -> constructorHint.withMode(ExecutableMode.INTROSPECT)); }); - generator.generate(hints); + generator.write(hints); assertEquals(""" [ { @@ -152,12 +152,12 @@ public class FileNativeConfigurationGeneratorTests { @Test void resourceConfig() throws IOException, JSONException { - FileNativeConfigurationGenerator generator = new FileNativeConfigurationGenerator(tempDir); + FileNativeConfigurationWriter generator = new FileNativeConfigurationWriter(tempDir); RuntimeHints hints = new RuntimeHints(); ResourceHints resourceHints = hints.resources(); resourceHints.registerPattern("com/example/test.properties"); resourceHints.registerPattern("com/example/another.properties"); - generator.generate(hints); + generator.write(hints); assertEquals(""" { "resources": { @@ -174,11 +174,11 @@ public class FileNativeConfigurationGeneratorTests { String groupId = "foo.bar"; String artifactId = "baz"; String filename = "resource-config.json"; - FileNativeConfigurationGenerator generator = new FileNativeConfigurationGenerator(tempDir, groupId, artifactId); + FileNativeConfigurationWriter generator = new FileNativeConfigurationWriter(tempDir, groupId, artifactId); RuntimeHints hints = new RuntimeHints(); ResourceHints resourceHints = hints.resources(); resourceHints.registerPattern("com/example/test.properties"); - generator.generate(hints); + generator.write(hints); Path jsonFile = tempDir.resolve("META-INF").resolve("native-image").resolve(groupId).resolve(artifactId).resolve(filename); assertThat(jsonFile.toFile().exists()).isTrue(); } diff --git a/spring-core/src/test/java/org/springframework/aot/nativex/JavaSerializationHintsSerializerTests.java b/spring-core/src/test/java/org/springframework/aot/nativex/JavaSerializationHintsWriterTests.java similarity index 83% rename from spring-core/src/test/java/org/springframework/aot/nativex/JavaSerializationHintsSerializerTests.java rename to spring-core/src/test/java/org/springframework/aot/nativex/JavaSerializationHintsWriterTests.java index b0ea9bd2f57..9783e5a3aa6 100644 --- a/spring-core/src/test/java/org/springframework/aot/nativex/JavaSerializationHintsSerializerTests.java +++ b/spring-core/src/test/java/org/springframework/aot/nativex/JavaSerializationHintsWriterTests.java @@ -16,6 +16,8 @@ package org.springframework.aot.nativex; +import java.io.StringWriter; + import org.json.JSONException; import org.junit.jupiter.api.Test; import org.skyscreamer.jsonassert.JSONAssert; @@ -26,13 +28,11 @@ import org.springframework.aot.hint.TypeReference; import org.springframework.core.env.Environment; /** - * Tests for {@link JavaSerializationHintsSerializer}. + * Tests for {@link JavaSerializationHintsWriter}. * * @author Sebastien Deleuze */ -public class JavaSerializationHintsSerializerTests { - - private final JavaSerializationHintsSerializer serializer = new JavaSerializationHintsSerializer(); +public class JavaSerializationHintsWriterTests { @Test void empty() throws JSONException { @@ -62,7 +62,10 @@ public class JavaSerializationHintsSerializerTests { } private void assertEquals(String expectedString, JavaSerializationHints hints) throws JSONException { - JSONAssert.assertEquals(expectedString, serializer.serialize(hints), JSONCompareMode.LENIENT); + StringWriter out = new StringWriter(); + BasicJsonWriter writer = new BasicJsonWriter(out, "\t"); + JavaSerializationHintsWriter.INSTANCE.write(writer, hints); + JSONAssert.assertEquals(expectedString, out.toString(), JSONCompareMode.LENIENT); } } diff --git a/spring-core/src/test/java/org/springframework/aot/nativex/ProxyHintsSerializerTests.java b/spring-core/src/test/java/org/springframework/aot/nativex/ProxyHintsWriterTests.java similarity index 84% rename from spring-core/src/test/java/org/springframework/aot/nativex/ProxyHintsSerializerTests.java rename to spring-core/src/test/java/org/springframework/aot/nativex/ProxyHintsWriterTests.java index e31b4e9b29c..4bb7e73f009 100644 --- a/spring-core/src/test/java/org/springframework/aot/nativex/ProxyHintsSerializerTests.java +++ b/spring-core/src/test/java/org/springframework/aot/nativex/ProxyHintsWriterTests.java @@ -16,6 +16,7 @@ package org.springframework.aot.nativex; +import java.io.StringWriter; import java.util.function.Consumer; import java.util.function.Function; @@ -27,13 +28,11 @@ import org.skyscreamer.jsonassert.JSONCompareMode; import org.springframework.aot.hint.ProxyHints; /** - * Tests for {@link ProxyHintsSerializer}. + * Tests for {@link ProxyHintsWriter}. * * @author Sebastien Deleuze */ -public class ProxyHintsSerializerTests { - - private final ProxyHintsSerializer serializer = new ProxyHintsSerializer(); +public class ProxyHintsWriterTests { @Test void empty() throws JSONException { @@ -64,8 +63,10 @@ public class ProxyHintsSerializerTests { } private void assertEquals(String expectedString, ProxyHints hints) throws JSONException { - - JSONAssert.assertEquals(expectedString, serializer.serialize(hints), JSONCompareMode.LENIENT); + StringWriter out = new StringWriter(); + BasicJsonWriter writer = new BasicJsonWriter(out, "\t"); + ProxyHintsWriter.INSTANCE.write(writer, hints); + JSONAssert.assertEquals(expectedString, out.toString(), JSONCompareMode.LENIENT); } } diff --git a/spring-core/src/test/java/org/springframework/aot/nativex/ReflectionHintsSerializerTests.java b/spring-core/src/test/java/org/springframework/aot/nativex/ReflectionHintsWriterTests.java similarity index 94% rename from spring-core/src/test/java/org/springframework/aot/nativex/ReflectionHintsSerializerTests.java rename to spring-core/src/test/java/org/springframework/aot/nativex/ReflectionHintsWriterTests.java index 508b64a06f6..0514ea9c587 100644 --- a/spring-core/src/test/java/org/springframework/aot/nativex/ReflectionHintsSerializerTests.java +++ b/spring-core/src/test/java/org/springframework/aot/nativex/ReflectionHintsWriterTests.java @@ -16,6 +16,7 @@ package org.springframework.aot.nativex; +import java.io.StringWriter; import java.nio.charset.Charset; import java.util.Collections; import java.util.List; @@ -33,13 +34,11 @@ import org.springframework.core.codec.StringDecoder; import org.springframework.util.MimeType; /** - * Tests for {@link ReflectionHintsSerializer}. + * Tests for {@link ReflectionHintsWriter}. * * @author Sebastien Deleuze */ -public class ReflectionHintsSerializerTests { - - private final ReflectionHintsSerializer serializer = new ReflectionHintsSerializer(); +public class ReflectionHintsWriterTests { @Test void empty() throws JSONException { @@ -158,6 +157,7 @@ public class ReflectionHintsSerializerTests { ] """, hints); } + @Test void methodAndQueriedMethods() throws JSONException { ReflectionHints hints = new ReflectionHints(); @@ -188,7 +188,10 @@ public class ReflectionHintsSerializerTests { } private void assertEquals(String expectedString, ReflectionHints hints) throws JSONException { - JSONAssert.assertEquals(expectedString, serializer.serialize(hints), JSONCompareMode.LENIENT); + StringWriter out = new StringWriter(); + BasicJsonWriter writer = new BasicJsonWriter(out, "\t"); + ReflectionHintsWriter.INSTANCE.write(writer, hints); + JSONAssert.assertEquals(expectedString, out.toString(), JSONCompareMode.LENIENT); } } diff --git a/spring-core/src/test/java/org/springframework/aot/nativex/ResourceHintsSerializerTests.java b/spring-core/src/test/java/org/springframework/aot/nativex/ResourceHintsWriterTests.java similarity index 90% rename from spring-core/src/test/java/org/springframework/aot/nativex/ResourceHintsSerializerTests.java rename to spring-core/src/test/java/org/springframework/aot/nativex/ResourceHintsWriterTests.java index 075f870ae40..c789d392017 100644 --- a/spring-core/src/test/java/org/springframework/aot/nativex/ResourceHintsSerializerTests.java +++ b/spring-core/src/test/java/org/springframework/aot/nativex/ResourceHintsWriterTests.java @@ -16,6 +16,8 @@ package org.springframework.aot.nativex; +import java.io.StringWriter; + import org.json.JSONException; import org.junit.jupiter.api.Test; import org.skyscreamer.jsonassert.JSONAssert; @@ -24,13 +26,11 @@ import org.skyscreamer.jsonassert.JSONCompareMode; import org.springframework.aot.hint.ResourceHints; /** - * Tests for {@link ResourceHintsSerializer}. + * Tests for {@link ResourceHintsWriter}. * * @author Sebastien Deleuze */ -public class ResourceHintsSerializerTests { - - private final ResourceHintsSerializer serializer = new ResourceHintsSerializer(); +public class ResourceHintsWriterTests { @Test void empty() throws JSONException { @@ -117,7 +117,10 @@ public class ResourceHintsSerializerTests { } private void assertEquals(String expectedString, ResourceHints hints) throws JSONException { - JSONAssert.assertEquals(expectedString, serializer.serialize(hints), JSONCompareMode.LENIENT); + StringWriter out = new StringWriter(); + BasicJsonWriter writer = new BasicJsonWriter(out, "\t"); + ResourceHintsWriter.INSTANCE.write(writer, hints); + JSONAssert.assertEquals(expectedString, out.toString(), JSONCompareMode.LENIENT); } }