2020import java .util .ArrayList ;
2121import java .util .Arrays ;
2222import java .util .HashMap ;
23- import java .util .HashSet ;
2423import java .util .LinkedHashMap ;
2524import java .util .List ;
2625import java .util .Map ;
27- import java .util .Set ;
2826import java .util .stream .Collectors ;
2927
3028public class $RefParser {
@@ -148,45 +146,28 @@ private void mergeAllOf(Object value, String[] paths, URI currentFileURL) {
148146// visited.add(value);
149147 if (paths .length > 0 && "allOf" .equals (paths [paths .length -1 ])) {
150148 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 ();
154153 for (int i = 0 ; i < allOf .size (); i ++) {
155154 if (allOf .get (i ) instanceof Map ) {
156155 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 );
177157 } else {
178158 throw new RuntimeException ("Could not understand allOf: " + allOf .get (i ));
179159 }
180160 }
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+ // }
187167 String [] jsonPaths = Arrays .copyOf (paths , paths .length -1 );
188168 String jsonPath = jsonPath (jsonPaths );
189169 try {
170+ var mergedAllOfObject = allOfObject .buildAllOfObject ();
190171 refs .jsonContext .set (jsonPath , mergedAllOfObject );
191172 refs .saveOriginalAllOf (mergedAllOfObject , allOf );
192173 } catch (Exception e ){
@@ -207,6 +188,44 @@ private void mergeAllOf(Object value, String[] paths, URI currentFileURL) {
207188 }
208189 }
209190
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+
210229 private List <Object > visited = new ArrayList <>();
211230 private List <String > indent = new ArrayList <>();
212231 private String indent () {
0 commit comments