|
11 | 11 | import org.snakeyaml.engine.v2.api.LoadSettings; |
12 | 12 | import org.snakeyaml.engine.v2.nodes.Tag; |
13 | 13 | import org.snakeyaml.engine.v2.resolver.ScalarResolver; |
14 | | - |
15 | | -// Copied from org.snakeyaml.engine.v2.resolver.ResolverTuple because it was marked non-public |
16 | | -/** |
17 | | - * Copyright (c) 2018, http://www.snakeyaml.org |
18 | | - * <p> |
19 | | - * Licensed under the Apache License, Version 2.0 (the "License"); |
20 | | - * you may not use this file except in compliance with the License. |
21 | | - * You may obtain a copy of the License at |
22 | | - * <p> |
23 | | - * http://www.apache.org/licenses/LICENSE-2.0 |
24 | | - * <p> |
25 | | - * Unless required by applicable law or agreed to in writing, software |
26 | | - * distributed under the License is distributed on an "AS IS" BASIS, |
27 | | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
28 | | - * See the License for the specific language governing permissions and |
29 | | - * limitations under the License. |
30 | | - */ |
31 | | -final class ResolverTuple { |
32 | | - private final Tag tag; |
33 | | - private final Pattern regexp; |
34 | | - |
35 | | - public ResolverTuple(Tag tag, Pattern regexp) { |
36 | | - Objects.requireNonNull(tag, "Tag must be provided"); |
37 | | - Objects.requireNonNull(regexp, "regexp must be provided"); |
38 | | - this.tag = tag; |
39 | | - this.regexp = regexp; |
40 | | - } |
41 | | - |
42 | | - public Tag getTag() { |
43 | | - return tag; |
44 | | - } |
45 | | - |
46 | | - public Pattern getRegexp() { |
47 | | - return regexp; |
48 | | - } |
49 | | - |
50 | | - @Override |
51 | | - public String toString() { |
52 | | - return "Tuple tag=" + tag + " regexp=" + regexp; |
53 | | - } |
54 | | -} |
55 | | - |
56 | | - |
57 | | -// Adapted from org.snakeyaml.engine.v2.resolver.JsonScalarResolver |
58 | | -// Not guaranteed to be complete coverage of the YAML 1.2 Core Schema |
59 | | -// 2021-02-03 Supports 'True'/'False'/'TRUE','FALSE' as boolean; 'Null', 'NULL', an '~' as null |
60 | | -/** |
61 | | - * Copyright (c) 2018, http://www.snakeyaml.org |
62 | | - * <p> |
63 | | - * Licensed under the Apache License, Version 2.0 (the "License"); |
64 | | - * you may not use this file except in compliance with the License. |
65 | | - * You may obtain a copy of the License at |
66 | | - * <p> |
67 | | - * http://www.apache.org/licenses/LICENSE-2.0 |
68 | | - * <p> |
69 | | - * Unless required by applicable law or agreed to in writing, software |
70 | | - * distributed under the License is distributed on an "AS IS" BASIS, |
71 | | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
72 | | - * See the License for the specific language governing permissions and |
73 | | - * limitations under the License. |
74 | | - */ |
75 | | -class CoreScalarResolver implements ScalarResolver { |
76 | | - public final Pattern BOOL = Pattern.compile("^(?:true|false|True|False|TRUE|FALSE)$"); |
77 | | - public static final Pattern FLOAT = Pattern |
78 | | - .compile("^(-?(0?\\.[0-9]+|[1-9][0-9]*(\\.[0-9]*)?)(e[-+]?[0-9]+)?)|-?\\.(?:inf)|\\.(?:nan)$"); // NOSONAR |
79 | | - public static final Pattern INT = Pattern.compile("^(?:-?(?:0|[1-9][0-9]*))$"); |
80 | | - public static final Pattern NULL = Pattern.compile("^(?:null|Null|NULL|~)$"); |
81 | | - public static final Pattern EMPTY = Pattern.compile("^$"); |
82 | | - |
83 | | - public static final Pattern ENV_FORMAT = Pattern |
84 | | - .compile("^\\$\\{\\s*((?<name>\\w+)((?<separator>:?(-|\\?))(?<value>\\w+)?)?)\\s*\\}$"); |
85 | | - |
86 | | - protected Map<Character, List<ResolverTuple>> yamlImplicitResolvers = new HashMap<Character, List<ResolverTuple>>(); |
87 | | - |
88 | | - public void addImplicitResolver(Tag tag, Pattern regexp, String first) { |
89 | | - if (first == null) { |
90 | | - List<ResolverTuple> curr = yamlImplicitResolvers.computeIfAbsent(null, c -> new ArrayList<ResolverTuple>()); |
91 | | - curr.add(new ResolverTuple(tag, regexp)); |
92 | | - } else { |
93 | | - char[] chrs = first.toCharArray(); |
94 | | - for (int i = 0, j = chrs.length; i < j; i++) { |
95 | | - Character theC = Character.valueOf(chrs[i]); |
96 | | - if (theC == 0) { |
97 | | - // special case: for null |
98 | | - theC = null; |
99 | | - } |
100 | | - List<ResolverTuple> curr = yamlImplicitResolvers.get(theC); |
101 | | - if (curr == null) { |
102 | | - curr = new ArrayList<ResolverTuple>(); |
103 | | - yamlImplicitResolvers.put(theC, curr); |
104 | | - } |
105 | | - curr.add(new ResolverTuple(tag, regexp)); |
106 | | - } |
107 | | - } |
108 | | - } |
109 | | - |
110 | | - protected void addImplicitResolvers() { |
111 | | - addImplicitResolver(Tag.NULL, EMPTY, null); |
112 | | - addImplicitResolver(Tag.BOOL, BOOL, "tfTF"); |
113 | | - /* |
114 | | - * INT must be before FLOAT because the regular expression for FLOAT matches INT |
115 | | - * (see issue 130) http://code.google.com/p/snakeyaml/issues/detail?id=130 |
116 | | - */ |
117 | | - addImplicitResolver(Tag.INT, INT, "-0123456789"); |
118 | | - addImplicitResolver(Tag.FLOAT, FLOAT, "-0123456789."); |
119 | | - addImplicitResolver(Tag.NULL, NULL, "nN~\u0000"); |
120 | | - addImplicitResolver(Tag.ENV_TAG, ENV_FORMAT, "$"); |
121 | | - } |
122 | | - |
123 | | - public CoreScalarResolver() { |
124 | | - addImplicitResolvers(); |
125 | | - } |
126 | | - |
127 | | - @Override |
128 | | - public Tag resolve(String value, Boolean implicit) { |
129 | | - if (!implicit) { |
130 | | - return Tag.STR; |
131 | | - } |
132 | | - final List<ResolverTuple> resolvers; |
133 | | - if (value.length() == 0) { |
134 | | - resolvers = yamlImplicitResolvers.get('\0'); |
135 | | - } else { |
136 | | - resolvers = yamlImplicitResolvers.get(value.charAt(0)); |
137 | | - } |
138 | | - if (resolvers != null) { |
139 | | - for (ResolverTuple v : resolvers) { |
140 | | - Tag tag = v.getTag(); |
141 | | - Pattern regexp = v.getRegexp(); |
142 | | - if (regexp.matcher(value).matches()) { |
143 | | - return tag; |
144 | | - } |
145 | | - } |
146 | | - } |
147 | | - if (yamlImplicitResolvers.containsKey(null)) { |
148 | | - for (ResolverTuple v : yamlImplicitResolvers.get(null)) { |
149 | | - Tag tag = v.getTag(); |
150 | | - Pattern regexp = v.getRegexp(); |
151 | | - if (regexp.matcher(value).matches()) { |
152 | | - return tag; |
153 | | - } |
154 | | - } |
155 | | - } |
156 | | - return Tag.STR; |
157 | | - } |
158 | | -} |
| 14 | +import org.snakeyaml.engine.v2.schema.CoreSchema; |
159 | 15 |
|
160 | 16 | public class YamlUtils { |
161 | 17 |
|
162 | 18 | public static Map<String, Object> mapFromString(final String text) { |
163 | | - LoadSettings settings = LoadSettings.builder().setScalarResolver(new CoreScalarResolver()).build(); |
| 19 | + LoadSettings settings = LoadSettings.builder().setSchema(new CoreSchema()).build(); |
164 | 20 | Load load = new Load(settings); |
165 | 21 | final Map<String, Object> result = (Map<String, Object>) load.loadFromString(text); |
166 | 22 | return result; |
167 | 23 | } |
168 | 24 |
|
169 | 25 | public static List<Object> listFromString(final String text) { |
170 | | - LoadSettings settings = LoadSettings.builder().setScalarResolver(new CoreScalarResolver()).build(); |
| 26 | + LoadSettings settings = LoadSettings.builder().setSchema(new CoreSchema()).build(); |
171 | 27 | Load load = new Load(settings); |
172 | 28 | final List<Object> result = (List<Object>) load.loadFromString(text); |
173 | 29 | return result; |
|
0 commit comments