20
20
import java .util .ArrayList ;
21
21
import java .util .Arrays ;
22
22
import java .util .HashMap ;
23
- import java .util .HashSet ;
24
23
import java .util .LinkedHashMap ;
25
24
import java .util .List ;
26
25
import java .util .Map ;
27
- import java .util .Set ;
28
26
import java .util .stream .Collectors ;
29
27
30
28
public class $RefParser {
@@ -148,45 +146,28 @@ private void mergeAllOf(Object value, String[] paths, URI currentFileURL) {
148
146
// visited.add(value);
149
147
if (paths .length > 0 && "allOf" .equals (paths [paths .length -1 ])) {
150
148
List allOf = (List ) value ;
151
- List <String > required = new ArrayList <>();
152
- Map <String , Object > properties = new LinkedHashMap <>();
153
- Map <String , Object > mergedAllOfObject = new LinkedHashMap <>();
149
+ // List<String> required = new ArrayList<>();
150
+ // Map<String, Object> properties = new LinkedHashMap<>();
151
+ // Map<String, Object> mergedAllOfObject = new LinkedHashMap<>();
152
+ AllOfObject allOfObject = new AllOfObject ();
154
153
for (int i = 0 ; i < allOf .size (); i ++) {
155
154
if (allOf .get (i ) instanceof Map ) {
156
155
Map <String , Object > item = (Map <String , Object >) allOf .get (i );
157
- if (item .keySet ().size () == 1 && item .containsKey ("allOf" )) {
158
- List <Map <String , Object >> items = (List ) item .get ("allOf" );
159
- for (Map <String , Object > innerItem : items ) {
160
- mergedAllOfObject .putAll (innerItem );
161
- if (innerItem .containsKey ("properties" )) {
162
- properties .putAll ((Map ) innerItem .get ("properties" ));
163
- }
164
- if (innerItem .containsKey ("required" )) {
165
- required .addAll ((List ) innerItem .get ("required" ));
166
- }
167
- }
168
- } else {
169
- mergedAllOfObject .putAll (item );
170
- if (item .containsKey ("properties" )) {
171
- properties .putAll ((Map ) item .get ("properties" ));
172
- }
173
- if (item .containsKey ("required" )) {
174
- required .addAll ((List ) item .get ("required" ));
175
- }
176
- }
156
+ merge (allOfObject , item );
177
157
} else {
178
158
throw new RuntimeException ("Could not understand allOf: " + allOf .get (i ));
179
159
}
180
160
}
181
- if (!required .isEmpty ()) {
182
- mergedAllOfObject .put ("required" , required );
183
- }
184
- if (!properties .isEmpty ()) {
185
- mergedAllOfObject .put ("properties" , properties );
186
- }
161
+ // if(!required.isEmpty()) {
162
+ // mergedAllOfObject.put("required", required);
163
+ // }
164
+ // if(!properties.isEmpty()) {
165
+ // mergedAllOfObject.put("properties", properties);
166
+ // }
187
167
String [] jsonPaths = Arrays .copyOf (paths , paths .length -1 );
188
168
String jsonPath = jsonPath (jsonPaths );
189
169
try {
170
+ var mergedAllOfObject = allOfObject .buildAllOfObject ();
190
171
refs .jsonContext .set (jsonPath , mergedAllOfObject );
191
172
refs .saveOriginalAllOf (mergedAllOfObject , allOf );
192
173
} catch (Exception e ){
@@ -207,6 +188,44 @@ private void mergeAllOf(Object value, String[] paths, URI currentFileURL) {
207
188
}
208
189
}
209
190
191
+ private void merge (AllOfObject allOfObject , List <Map <String , Object >> items ) {
192
+ for (Map <String , Object > innerItem : items ) {
193
+ merge (allOfObject , innerItem );
194
+ }
195
+ }
196
+
197
+ private void merge (AllOfObject allOfObject , Map <String , Object > item ) {
198
+ if (item .keySet ().size () == 1 && item .containsKey ("allOf" )) {
199
+ List <Map <String , Object >> items = (List ) item .get ("allOf" );
200
+ merge (allOfObject , items );
201
+ } else {
202
+ allOfObject .allOf .putAll (item );
203
+ if (item .containsKey ("properties" )) {
204
+ allOfObject .properties .putAll ((Map ) item .get ("properties" ));
205
+ }
206
+ if (item .containsKey ("required" )) {
207
+ allOfObject .required .addAll ((List ) item .get ("required" ));
208
+ }
209
+ }
210
+ }
211
+
212
+ private static class AllOfObject {
213
+ Map <String , Object > allOf = new HashMap <>();
214
+ Map <String , Object > properties = new HashMap <>();
215
+ List <String > required = new ArrayList <>();
216
+
217
+ Map <String , Object > buildAllOfObject () {
218
+ Map <String , Object > allOfObject = new LinkedHashMap <>(allOf );
219
+ if (!required .isEmpty ()) {
220
+ allOfObject .put ("required" , required );
221
+ }
222
+ if (!properties .isEmpty ()) {
223
+ allOfObject .put ("properties" , properties );
224
+ }
225
+ return allOfObject ;
226
+ }
227
+ }
228
+
210
229
private List <Object > visited = new ArrayList <>();
211
230
private List <String > indent = new ArrayList <>();
212
231
private String indent () {
0 commit comments