From 724f9ebf7107d99ac9bae4204b4f7c6444a49e03 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Mon, 5 Sep 2022 14:22:24 +0200 Subject: [PATCH] Support SnakeYaml 1.31 This commit keeps the managed dependency for SnakeYaml at 1.29 but enables forward compatibility for SnakeYaml 1.31. Closes gh-32228 --- .../boot/env/OriginTrackedYamlLoader.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java index 16861bac0bbf..708a826cef4d 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java @@ -45,6 +45,7 @@ import org.springframework.boot.origin.TextResourceOrigin; import org.springframework.boot.origin.TextResourceOrigin.Location; import org.springframework.core.io.Resource; +import org.springframework.util.ReflectionUtils; /** * Class to load {@code .yml} files into a map of {@code String} to @@ -55,6 +56,9 @@ */ class OriginTrackedYamlLoader extends YamlProcessor { + private static final boolean HAS_RESOLVER_LIMIT = ReflectionUtils.findMethod(Resolver.class, "addImplicitResolver", + Tag.class, Pattern.class, String.class, int.class) != null; + private final Resource resource; OriginTrackedYamlLoader(Resource resource) { @@ -75,7 +79,7 @@ private Yaml createYaml(LoaderOptions loaderOptions) { BaseConstructor constructor = new OriginTrackingConstructor(loaderOptions); Representer representer = new Representer(); DumperOptions dumperOptions = new DumperOptions(); - LimitedResolver resolver = new LimitedResolver(); + Resolver resolver = HAS_RESOLVER_LIMIT ? new NoTimestampResolverWithLimit() : new NoTimestampResolver(); return new Yaml(constructor, representer, dumperOptions, loaderOptions, resolver); } @@ -167,7 +171,7 @@ private static Node get(Node node) { /** * {@link Resolver} that limits {@link Tag#TIMESTAMP} tags. */ - private static class LimitedResolver extends Resolver { + private static class NoTimestampResolver extends Resolver { @Override public void addImplicitResolver(Tag tag, Pattern regexp, String first) { @@ -179,4 +183,19 @@ public void addImplicitResolver(Tag tag, Pattern regexp, String first) { } + /** + * {@link Resolver} that limits {@link Tag#TIMESTAMP} tags. + */ + private static class NoTimestampResolverWithLimit extends Resolver { + + @Override + public void addImplicitResolver(Tag tag, Pattern regexp, String first, int limit) { + if (tag == Tag.TIMESTAMP) { + return; + } + super.addImplicitResolver(tag, regexp, first, limit); + } + + } + }