|
| 1 | +package com.amartus.sonata.blender.impl.postprocess; |
| 2 | + |
| 3 | +import io.swagger.v3.oas.models.Components; |
| 4 | +import io.swagger.v3.oas.models.OpenAPI; |
| 5 | +import io.swagger.v3.oas.models.Operation; |
| 6 | +import io.swagger.v3.oas.models.PathItem; |
| 7 | +import io.swagger.v3.oas.models.headers.Header; |
| 8 | +import io.swagger.v3.oas.models.parameters.CookieParameter; |
| 9 | +import io.swagger.v3.oas.models.parameters.Parameter; |
| 10 | +import io.swagger.v3.oas.models.parameters.QueryParameter; |
| 11 | + |
| 12 | +import java.util.List; |
| 13 | +import java.util.Map; |
| 14 | +import java.util.Optional; |
| 15 | +import java.util.function.Consumer; |
| 16 | +import java.util.function.Function; |
| 17 | + |
| 18 | +public class RemoveDefaultParameterValues implements Consumer<OpenAPI> { |
| 19 | + |
| 20 | + |
| 21 | +@Override |
| 22 | +public void accept(OpenAPI api) { |
| 23 | +nullSafe(api.getPaths()).forEach(this::process); |
| 24 | +nullSafe(Optional |
| 25 | +.ofNullable(api.getComponents()) |
| 26 | +.map(Components::getPathItems).orElse(null) |
| 27 | +).forEach(this::process); |
| 28 | +Optional.ofNullable(api.getComponents()) |
| 29 | +.stream().flatMap(it -> nullSafe(it.getParameters()).entrySet().stream()) |
| 30 | +.forEach(it -> process(it.getValue())); |
| 31 | + |
| 32 | +} |
| 33 | + |
| 34 | +private <T,V> Map<T, V> nullSafe(Map<T, V> v) { |
| 35 | +if(v == null) return Map.of(); |
| 36 | +return v; |
| 37 | +} |
| 38 | + |
| 39 | +private <T> List<T> nullSafe(List<T> v) { |
| 40 | +return Optional.ofNullable(v).orElse(List.of()); |
| 41 | +} |
| 42 | +protected void process(String name, PathItem item) { |
| 43 | +nullSafe(item.readOperations()) |
| 44 | +.forEach(this::process); |
| 45 | +} |
| 46 | + |
| 47 | +private void process(Operation operation) { |
| 48 | +nullSafe(operation.getParameters()).forEach(this::process); |
| 49 | +nullSafe(operation.getResponses()).values().stream() |
| 50 | +.flatMap(it -> nullSafe(it.getHeaders()).values().stream()) |
| 51 | +.forEach(this::process); |
| 52 | +} |
| 53 | + |
| 54 | +private final Function<Parameter, Parameter.StyleEnum> defaultFormat = par -> { |
| 55 | +if(par instanceof QueryParameter || par instanceof CookieParameter) { |
| 56 | +return Parameter.StyleEnum.FORM; |
| 57 | +} |
| 58 | +return Parameter.StyleEnum.SIMPLE; |
| 59 | +}; |
| 60 | + |
| 61 | +private void process(Header header) { |
| 62 | +if(header == null) { |
| 63 | +return; |
| 64 | +} |
| 65 | +if(header.getStyle() == Header.StyleEnum.SIMPLE) { |
| 66 | +if(header.getExplode() == Boolean.FALSE) { |
| 67 | +header.setExplode(null); |
| 68 | +} |
| 69 | +header.setStyle(null); |
| 70 | +} |
| 71 | +} |
| 72 | + |
| 73 | +private void process(Parameter parameter) { |
| 74 | +var defStyle = defaultFormat.apply(parameter); |
| 75 | + |
| 76 | +if(defaultExplode(defStyle, parameter.getExplode())) { |
| 77 | +parameter.setExplode(null); |
| 78 | +} |
| 79 | + |
| 80 | +if(parameter.getStyle() == defStyle) { |
| 81 | +parameter.setStyle(null); |
| 82 | +} |
| 83 | +} |
| 84 | + |
| 85 | +private boolean defaultExplode(Parameter.StyleEnum defStyle, Boolean explode) { |
| 86 | +return (defStyle == Parameter.StyleEnum.FORM) == explode; |
| 87 | +} |
| 88 | +} |
0 commit comments