|
21 | 21 | import java.util.LinkedHashMap; |
22 | 22 | import java.util.Map; |
23 | 23 | import java.util.Set; |
| 24 | +import java.util.stream.Collectors; |
24 | 25 |
|
25 | 26 | public class ResolverFully { |
26 | 27 | private static final Logger LOGGER = LoggerFactory.getLogger(ResolverFully.class); |
27 | 28 |
|
| 29 | + private boolean aggregateCombinators; |
| 30 | + |
| 31 | + public ResolverFully() { |
| 32 | + this(true); |
| 33 | + } |
| 34 | + |
| 35 | + public ResolverFully(boolean aggregateCombinators) { |
| 36 | + this.aggregateCombinators = aggregateCombinators; |
| 37 | + } |
| 38 | + |
28 | 39 | private Map<String, Schema> schemas; |
29 | 40 | private Map<String, Schema> resolvedModels = new HashMap<>(); |
30 | 41 | private Map<String, Example> examples; |
@@ -179,78 +190,87 @@ public Schema resolveSchema(Schema schema) { |
179 | 190 |
|
180 | 191 | if(schema instanceof ComposedSchema) { |
181 | 192 | ComposedSchema composedSchema = (ComposedSchema) schema; |
182 | | - Schema model = SchemaTypeUtil.createSchema(composedSchema.getType(),composedSchema.getFormat()); |
183 | | - Set<String> requiredProperties = new HashSet<>(); |
184 | | - if(composedSchema.getAllOf() != null){ |
185 | | - for(Schema innerModel : composedSchema.getAllOf()) { |
186 | | - Schema resolved = resolveSchema(innerModel); |
187 | | - Map<String, Schema> properties = resolved.getProperties(); |
188 | | - if (resolved.getProperties() != null) { |
189 | | - |
190 | | - for (String key : properties.keySet()) { |
191 | | - Schema prop = (Schema) resolved.getProperties().get(key); |
192 | | - model.addProperties(key, resolveSchema(prop)); |
193 | | - } |
194 | | - if (resolved.getRequired() != null) { |
195 | | - for(int i =0;i<resolved.getRequired().size();i++){ |
196 | | - if (resolved.getRequired().get(i) != null) { |
197 | | - requiredProperties.add(resolved.getRequired().get(i).toString()); |
| 193 | + if (aggregateCombinators) { |
| 194 | + Schema model = SchemaTypeUtil.createSchema(composedSchema.getType(), composedSchema.getFormat()); |
| 195 | + Set<String> requiredProperties = new HashSet<>(); |
| 196 | + if (composedSchema.getAllOf() != null) { |
| 197 | + for (Schema innerModel : composedSchema.getAllOf()) { |
| 198 | + Schema resolved = resolveSchema(innerModel); |
| 199 | + Map<String, Schema> properties = resolved.getProperties(); |
| 200 | + if (resolved.getProperties() != null) { |
| 201 | + for (String key : properties.keySet()) { |
| 202 | + Schema prop = (Schema) resolved.getProperties().get(key); |
| 203 | + model.addProperties(key, resolveSchema(prop)); |
| 204 | + } |
| 205 | + if (resolved.getRequired() != null) { |
| 206 | + for (int i = 0; i < resolved.getRequired().size(); i++) { |
| 207 | + if (resolved.getRequired().get(i) != null) { |
| 208 | + requiredProperties.add(resolved.getRequired().get(i).toString()); |
| 209 | + } |
198 | 210 | } |
199 | 211 | } |
200 | 212 | } |
201 | 213 | } |
202 | | - } |
203 | | - }else if(composedSchema.getOneOf() != null){ |
204 | | - for(Schema innerModel : composedSchema.getOneOf()) { |
205 | | - Schema resolved = resolveSchema(innerModel); |
206 | | - Map<String, Schema> properties = resolved.getProperties(); |
207 | | - if (resolved.getProperties() != null) { |
208 | | - |
209 | | - for (String key : properties.keySet()) { |
210 | | - Schema prop = (Schema) resolved.getProperties().get(key); |
211 | | - model.addProperties(key, resolveSchema(prop)); |
212 | | - } |
213 | | - if (resolved.getRequired() != null) { |
214 | | - for(int i =0;i<resolved.getRequired().size();i++){ |
215 | | - if (resolved.getRequired().get(i) != null) { |
216 | | - requiredProperties.add(resolved.getRequired().get(i).toString()); |
| 214 | + } else if (composedSchema.getOneOf() != null) { |
| 215 | + for (Schema innerModel : composedSchema.getOneOf()) { |
| 216 | + Schema resolved = resolveSchema(innerModel); |
| 217 | + Map<String, Schema> properties = resolved.getProperties(); |
| 218 | + if (resolved.getProperties() != null) { |
| 219 | + |
| 220 | + for (String key : properties.keySet()) { |
| 221 | + Schema prop = (Schema) resolved.getProperties().get(key); |
| 222 | + model.addProperties(key, resolveSchema(prop)); |
| 223 | + } |
| 224 | + if (resolved.getRequired() != null) { |
| 225 | + for (int i = 0; i < resolved.getRequired().size(); i++) { |
| 226 | + if (resolved.getRequired().get(i) != null) { |
| 227 | + requiredProperties.add(resolved.getRequired().get(i).toString()); |
| 228 | + } |
217 | 229 | } |
218 | 230 | } |
219 | 231 | } |
220 | 232 | } |
221 | | - } |
222 | 233 |
|
223 | | - }else if(composedSchema.getAnyOf() != null){ |
224 | | - for(Schema innerModel : composedSchema.getAnyOf()) { |
225 | | - Schema resolved = resolveSchema(innerModel); |
226 | | - Map<String, Schema> properties = resolved.getProperties(); |
227 | | - if (resolved.getProperties() != null) { |
| 234 | + } else if (composedSchema.getAnyOf() != null) { |
| 235 | + for (Schema innerModel : composedSchema.getAnyOf()) { |
| 236 | + Schema resolved = resolveSchema(innerModel); |
| 237 | + Map<String, Schema> properties = resolved.getProperties(); |
| 238 | + if (resolved.getProperties() != null) { |
228 | 239 |
|
229 | | - for (String key : properties.keySet()) { |
230 | | - Schema prop = (Schema) resolved.getProperties().get(key); |
231 | | - model.addProperties(key, resolveSchema(prop)); |
232 | | - } |
233 | | - if (resolved.getRequired() != null) { |
234 | | - for(int i =0;i<resolved.getRequired().size();i++){ |
235 | | - if (resolved.getRequired().get(i) != null) { |
236 | | - requiredProperties.add(resolved.getRequired().get(i).toString()); |
| 240 | + for (String key : properties.keySet()) { |
| 241 | + Schema prop = (Schema) resolved.getProperties().get(key); |
| 242 | + model.addProperties(key, resolveSchema(prop)); |
| 243 | + } |
| 244 | + if (resolved.getRequired() != null) { |
| 245 | + for (int i = 0; i < resolved.getRequired().size(); i++) { |
| 246 | + if (resolved.getRequired().get(i) != null) { |
| 247 | + requiredProperties.add(resolved.getRequired().get(i).toString()); |
| 248 | + } |
237 | 249 | } |
238 | 250 | } |
239 | 251 | } |
240 | 252 | } |
241 | | - |
242 | 253 | } |
243 | | - } |
244 | | - if(requiredProperties.size() > 0) { |
245 | | - model.setRequired(new ArrayList<>(requiredProperties)); |
246 | | - } |
247 | | - if(composedSchema.getExtensions() != null) { |
248 | | - Map<String, Object> extensions = composedSchema.getExtensions(); |
249 | | - for(String key : extensions.keySet()) { |
250 | | - model.addExtension(key, composedSchema.getExtensions().get(key)); |
| 254 | + if (requiredProperties.size() > 0) { |
| 255 | + model.setRequired(new ArrayList<>(requiredProperties)); |
| 256 | + } |
| 257 | + if (composedSchema.getExtensions() != null) { |
| 258 | + Map<String, Object> extensions = composedSchema.getExtensions(); |
| 259 | + for (String key : extensions.keySet()) { |
| 260 | + model.addExtension(key, composedSchema.getExtensions().get(key)); |
| 261 | + } |
251 | 262 | } |
| 263 | + return model; |
| 264 | + } else { |
| 265 | + // User don't want to aggregate composed schema, we only solve refs |
| 266 | + if (composedSchema.getAllOf() != null) |
| 267 | + composedSchema.allOf(composedSchema.getAllOf().stream().map(this::resolveSchema).collect(Collectors.toList())); |
| 268 | + else if (composedSchema.getOneOf() != null) |
| 269 | + composedSchema.oneOf(composedSchema.getOneOf().stream().map(this::resolveSchema).collect(Collectors.toList())); |
| 270 | + else if (composedSchema.getAnyOf() != null) |
| 271 | + composedSchema.anyOf(composedSchema.getAnyOf().stream().map(this::resolveSchema).collect(Collectors.toList())); |
| 272 | + return composedSchema; |
252 | 273 | } |
253 | | - return model; |
254 | 274 | } |
255 | 275 |
|
256 | 276 | if (schema.getProperties() != null) { |
|
0 commit comments