From 60fab675a6aa135dd3820f51c2c43c444e8dd4d2 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Tue, 27 Feb 2024 15:38:34 -0800 Subject: [PATCH 01/32] Adds ParameterSerializerBase --- .../client/parameter/StyleSerializerBase.java | 195 ++++++++++++++++++ .../parameter/StyleSerializerBase.hbs | 195 ++++++++++++++++++ 2 files changed, 390 insertions(+) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSerializerBase.java create mode 100644 src/main/resources/java/src/main/java/packagename/parameter/StyleSerializerBase.hbs diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSerializerBase.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSerializerBase.java new file mode 100644 index 00000000000..eaaae60d4cd --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSerializerBase.java @@ -0,0 +1,195 @@ +package org.openapijsonschematools.client.parameter; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.AbstractMap; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import java.util.Objects; +import java.util.Set; + +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; + +public class ParameterSerializerBase { + private static final String ENCODING = "UTF-8"; + private static final Set namedParameterSeparators = Set.of("&", ";"); + + private static String percentEncode(String s) { + if (s == null) { + return ""; + } + try { + return URLEncoder.encode(s, ENCODING) + // OAuth encodes some characters differently: + .replace("+", "%20").replace("*", "%2A") + .replace("%7E", "~"); + // This could be done faster with more hand-crafted code. + } catch (UnsupportedEncodingException wow) { + throw new RuntimeException(wow.getMessage(), wow); + } + } + + private static @Nullable String rfc6570ItemValue(@Nullable Object item, boolean percentEncode) { + /* + Get representation if str/float/int/None/items in list/ values in dict + None is returned if an item is undefined, use cases are value= + - None + - [] + - {} + - [None, None None] + - {'a': None, 'b': None} + */ + if (item instanceof String stringItem) { + if (percentEncode) { + return percentEncode(stringItem); + } + return stringItem; + } else if (item instanceof Number numberItem) { + return numberItem.toString(); + } else if (item == null) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } else if (item instanceof List && ((List) item).isEmpty()) { + // // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } else if (item instanceof Map && ((Map) item).isEmpty()) { + // // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } + throw new InvalidTypeException("Unable to generate a rfc6570 item representation of "+item); + } + + private static String rfc6570StrNumberExpansion( + @Nullable Object inData, + boolean percentEncode, + Object prefixSeparatorIterator, // todo fix this + String varNamePiece, + boolean namedParameterExpansion + ) { + var itemValue = rfc6570ItemValue(inData, percentEncode); + if (itemValue == null || (itemValue.isEmpty() && prefixSeparatorIterator.separator == ';')) { + return next(prefixSeparatorIterator) + varNamePiece; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + return next(prefixSeparatorIterator) + varNamePiece + valuePairEquals + itemValue; + } + + private static String rfc6570ListExpansion( + List inData, + boolean explode, + boolean percentEncode, + Object prefixSeparatorIterator, // todo fix this + String varNamePiece, + boolean namedParameterExpansion + ) { + var itemValues = inData.stream() + .map(v -> rfc6570ItemValue(v, percentEncode)) + .filter(Objects::nonNull) + .collect(toList()); + if (itemValues.isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + if (!explode) { + return ( + next(prefixSeparatorIterator) + + varNamePiece + + valuePairEquals + + prefixSeparatorIterator.itemSeparator.join(itemValues) + ); + } + // exploded + return next(prefixSeparatorIterator) + next(prefixSeparatorIterator).join( + itemValues.stream().map(v -> varNamePiece + valuePairEquals + v).collect(toList()) + ); + } + + private static String rfc6570MapExpansion( + Map inData, + boolean explode, + boolean percentEncode, + Object prefixSeparatorIterator, // todo fix this + String varNamePiece, + boolean namedParameterExpansion + ) { + var inDataMap = inData.entrySet().stream() + .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), rfc6570ItemValue(entry.getValue(), percentEncode))) + .filter(entry -> entry.getValue() != null) + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, HashMap::new)); + + if (inDataMap.isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + if (!explode) { + return ( + next(prefixSeparatorIterator) + + varNamePiece + + valuePairEquals + + prefixSeparatorIterator.itemSeparator.join( + prefixSeparatorIterator.itemSeparator.join( + inDataMap.entrySet().stream().map(e -> List.of(e.getKey(), e.getValue())) + ) + ) + ); + } + // exploded + return next(prefixSeparatorIterator) + next(prefixSeparatorIterator).join( + inDataMap.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(toList()) + ); + } + + public static String rfc6570Expansion( + String variableName, + @Nullable Object inData, + boolean explode, + boolean percentEncode, + Object prefixSeparatorIterator // todo fix this + ) { + /* + Separator is for separate variables like dict with explode true, + not for array item separation + */ + var namedParameterExpansion = namedParameterSeparators.contains(prefixSeparatorIterator.separator); + var varNamePiece = namedParameterExpansion ? variableName : ""; + if (inData instanceof Number || inData instanceof String) { + return rfc6570StrNumberExpansion( + inData, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } else if (inData == null) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } else if (inData instanceof List listData) { + return rfc6570ListExpansion( + listData, + explode, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } else if (inData instanceof Map mapData) { + return rfc6570MapExpansion( + mapData, + explode, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } + // bool, bytes, etc + throw new InvalidTypeException("Unable to generate a rfc6570 representation of "+inData); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/parameter/StyleSerializerBase.hbs b/src/main/resources/java/src/main/java/packagename/parameter/StyleSerializerBase.hbs new file mode 100644 index 00000000000..98ae8d3e83f --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/parameter/StyleSerializerBase.hbs @@ -0,0 +1,195 @@ +package {{{packageName}}}.parameter; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.exceptions.InvalidTypeException; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.AbstractMap; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import java.util.Objects; +import java.util.Set; + +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; + +public class ParameterSerializerBase { + private static final String ENCODING = "UTF-8"; + private static final Set namedParameterSeparators = Set.of("&", ";"); + + private static String percentEncode(String s) { + if (s == null) { + return ""; + } + try { + return URLEncoder.encode(s, ENCODING) + // OAuth encodes some characters differently: + .replace("+", "%20").replace("*", "%2A") + .replace("%7E", "~"); + // This could be done faster with more hand-crafted code. + } catch (UnsupportedEncodingException wow) { + throw new RuntimeException(wow.getMessage(), wow); + } + } + + private static @Nullable String rfc6570ItemValue(@Nullable Object item, boolean percentEncode) { + /* + Get representation if str/float/int/None/items in list/ values in dict + None is returned if an item is undefined, use cases are value= + - None + - [] + - {} + - [None, None None] + - {'a': None, 'b': None} + */ + if (item instanceof String stringItem) { + if (percentEncode) { + return percentEncode(stringItem); + } + return stringItem; + } else if (item instanceof Number numberItem) { + return numberItem.toString(); + } else if (item == null) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } else if (item instanceof List && ((List) item).isEmpty()) { + // // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } else if (item instanceof Map && ((Map) item).isEmpty()) { + // // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } + throw new InvalidTypeException("Unable to generate a rfc6570 item representation of "+item); + } + + private static String rfc6570StrNumberExpansion( + @Nullable Object inData, + boolean percentEncode, + Object prefixSeparatorIterator, // todo fix this + String varNamePiece, + boolean namedParameterExpansion + ) { + var itemValue = rfc6570ItemValue(inData, percentEncode); + if (itemValue == null || (itemValue.isEmpty() && prefixSeparatorIterator.separator == ';')) { + return next(prefixSeparatorIterator) + varNamePiece; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + return next(prefixSeparatorIterator) + varNamePiece + valuePairEquals + itemValue; + } + + private static String rfc6570ListExpansion( + List inData, + boolean explode, + boolean percentEncode, + Object prefixSeparatorIterator, // todo fix this + String varNamePiece, + boolean namedParameterExpansion + ) { + var itemValues = inData.stream() + .map(v -> rfc6570ItemValue(v, percentEncode)) + .filter(Objects::nonNull) + .collect(toList()); + if (itemValues.isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + if (!explode) { + return ( + next(prefixSeparatorIterator) + + varNamePiece + + valuePairEquals + + prefixSeparatorIterator.itemSeparator.join(itemValues) + ); + } + // exploded + return next(prefixSeparatorIterator) + next(prefixSeparatorIterator).join( + itemValues.stream().map(v -> varNamePiece + valuePairEquals + v).collect(toList()) + ); + } + + private static String rfc6570MapExpansion( + Map inData, + boolean explode, + boolean percentEncode, + Object prefixSeparatorIterator, // todo fix this + String varNamePiece, + boolean namedParameterExpansion + ) { + var inDataMap = inData.entrySet().stream() + .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), rfc6570ItemValue(entry.getValue(), percentEncode))) + .filter(entry -> entry.getValue() != null) + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, HashMap::new)); + + if (inDataMap.isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + if (!explode) { + return ( + next(prefixSeparatorIterator) + + varNamePiece + + valuePairEquals + + prefixSeparatorIterator.itemSeparator.join( + prefixSeparatorIterator.itemSeparator.join( + inDataMap.entrySet().stream().map(e -> List.of(e.getKey(), e.getValue())) + ) + ) + ); + } + // exploded + return next(prefixSeparatorIterator) + next(prefixSeparatorIterator).join( + inDataMap.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(toList()) + ); + } + + public static String rfc6570Expansion( + String variableName, + @Nullable Object inData, + boolean explode, + boolean percentEncode, + Object prefixSeparatorIterator // todo fix this + ) { + /* + Separator is for separate variables like dict with explode true, + not for array item separation + */ + var namedParameterExpansion = namedParameterSeparators.contains(prefixSeparatorIterator.separator); + var varNamePiece = namedParameterExpansion ? variableName : ""; + if (inData instanceof Number || inData instanceof String) { + return rfc6570StrNumberExpansion( + inData, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } else if (inData == null) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } else if (inData instanceof List listData) { + return rfc6570ListExpansion( + listData, + explode, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } else if (inData instanceof Map mapData) { + return rfc6570MapExpansion( + mapData, + explode, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } + // bool, bytes, etc + throw new InvalidTypeException("Unable to generate a rfc6570 representation of "+inData); + } +} \ No newline at end of file From 84cfd987e17dacb9f8f6eb357123d08eb4294513 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Tue, 27 Feb 2024 22:40:25 -0800 Subject: [PATCH 02/32] Adds classes that header class needs --- .../client/header/Header.java | 37 +++++++++++++++ .../client/mediatype/Encoding.java | 2 +- .../client/parameter/ParameterBase.java | 27 +++++++++++ .../client/parameter/ParameterInType.java | 8 ++++ ...Base.java => ParameterSerializerBase.java} | 43 +++++++---------- .../parameter/PrefixSeparatorIterator.java | 27 +++++++++++ .../parameter/StyleSimpleSerializer.java | 21 +++++++++ .../generators/JavaClientGenerator.java | 17 +++++++ .../main/java/packagename/header/Header.hbs | 37 +++++++++++++++ .../packagename/parameter/ParameterBase.hbs | 27 +++++++++++ .../packagename/parameter/ParameterInType | 8 ++++ ...erBase.hbs => ParameterSerializerBase.hbs} | 47 ++++++++----------- .../parameter/PrefixSeparatorIterator.hbs | 27 +++++++++++ .../parameter/StyleSimpleSerializer.hbs | 21 +++++++++ 14 files changed, 294 insertions(+), 55 deletions(-) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterBase.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/{StyleSerializerBase.java => ParameterSerializerBase.java} (80%) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/PrefixSeparatorIterator.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSimpleSerializer.java create mode 100644 src/main/resources/java/src/main/java/packagename/header/Header.hbs create mode 100644 src/main/resources/java/src/main/java/packagename/parameter/ParameterBase.hbs create mode 100644 src/main/resources/java/src/main/java/packagename/parameter/ParameterInType rename src/main/resources/java/src/main/java/packagename/parameter/{StyleSerializerBase.hbs => ParameterSerializerBase.hbs} (80%) create mode 100644 src/main/resources/java/src/main/java/packagename/parameter/PrefixSeparatorIterator.hbs create mode 100644 src/main/resources/java/src/main/java/packagename/parameter/StyleSimpleSerializer.hbs diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java new file mode 100644 index 00000000000..da0338fe232 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java @@ -0,0 +1,37 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.mediatype.MediaType; +import org.openapijsonschematools.client.parameter.ParameterBase; +import org.openapijsonschematools.client.parameter.ParameterInType; +import org.openapijsonschematools.client.parameter.ParameterStyle; +import org.openapijsonschematools.client.parameter.StyleSimpleSerializer; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; + +import java.net.http.HttpHeaders; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class Header extends ParameterBase { + public Header(boolean required, @Nullable boolean allowReserved, JsonSchema schema, @Nullable Map> content) { + super(ParameterInType.HEADER, required, ParameterStyle.SIMPLE, false, allowReserved, schema, content); + } + + private static HttpHeaders toHeaders(String name, String value) { + Map> map = Map.of(name, List.of(value)); + BiPredicate headerFilter = (key, val) -> true; + return HttpHeaders.of(map, headerFilter); + } + + public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { + if (schema != null) { + var castInData = skipValidation ? inData : schema.validate(inData, configuration); + var value = StyleSimpleSerializer.serializeSimple(castInData, name, explode, false); + return toHeaders(name, value); + } else { + throw new RuntimeException("Serializing header with content has not yet been implemented"); + } + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java index d36fae2df8a..b6c6d309896 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java @@ -7,7 +7,7 @@ public class Encoding { public final String contentType; - public final @Nullable Map headers; // todo change value to HeaderParameter + public final @Nullable Map headers; // todo change value to Header public final @Nullable ParameterStyle style; public final boolean explode; public final boolean allowReserved; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterBase.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterBase.java new file mode 100644 index 00000000000..5d6b0ee9806 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterBase.java @@ -0,0 +1,27 @@ +package org.openapijsonschematools.client.parameter; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.mediatype.MediaType; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; + +import java.util.Map; + +public class ParameterBase { + public final ParameterInType inType; + public final boolean required; + public final @Nullable ParameterStyle style; + public final @Nullable boolean explode; + public final @Nullable boolean allowReserved; + public final @Nullable JsonSchema schema; + public final @Nullable Map> content; + + public ParameterBase(ParameterInType inType, boolean required, @Nullable ParameterStyle style, @Nullable boolean explode, @Nullable boolean allowReserved, JsonSchema schema, @Nullable Map> content) { + this.inType = inType; + this.required = required; + this.style = style; + this.explode = explode; + this.allowReserved = allowReserved; + this.schema = schema; + this.content = content; + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java new file mode 100644 index 00000000000..94fa042f27c --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java @@ -0,0 +1,8 @@ +package org.openapijsonschematools.client.parameter; + +public enum ParameterInType { + QUERY, + HEADER, + PATH, + COOKIE +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSerializerBase.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterSerializerBase.java similarity index 80% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSerializerBase.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterSerializerBase.java index eaaae60d4cd..578216ca795 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSerializerBase.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterSerializerBase.java @@ -11,6 +11,7 @@ import java.util.HashMap; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; @@ -67,23 +68,23 @@ private static String percentEncode(String s) { private static String rfc6570StrNumberExpansion( @Nullable Object inData, boolean percentEncode, - Object prefixSeparatorIterator, // todo fix this + PrefixSeparatorIterator prefixSeparatorIterator, String varNamePiece, boolean namedParameterExpansion ) { var itemValue = rfc6570ItemValue(inData, percentEncode); - if (itemValue == null || (itemValue.isEmpty() && prefixSeparatorIterator.separator == ';')) { - return next(prefixSeparatorIterator) + varNamePiece; + if (itemValue == null || (itemValue.isEmpty() && prefixSeparatorIterator.separator.equals(";"))) { + return prefixSeparatorIterator.next() + varNamePiece; } var valuePairEquals = namedParameterExpansion ? "=" : ""; - return next(prefixSeparatorIterator) + varNamePiece + valuePairEquals + itemValue; + return prefixSeparatorIterator.next() + varNamePiece + valuePairEquals + itemValue; } private static String rfc6570ListExpansion( List inData, boolean explode, boolean percentEncode, - Object prefixSeparatorIterator, // todo fix this + PrefixSeparatorIterator prefixSeparatorIterator, String varNamePiece, boolean namedParameterExpansion ) { @@ -98,23 +99,21 @@ private static String rfc6570ListExpansion( var valuePairEquals = namedParameterExpansion ? "=" : ""; if (!explode) { return ( - next(prefixSeparatorIterator) + + prefixSeparatorIterator.next() + varNamePiece + valuePairEquals + - prefixSeparatorIterator.itemSeparator.join(itemValues) + String.join(prefixSeparatorIterator.itemSeparator, itemValues) ); } // exploded - return next(prefixSeparatorIterator) + next(prefixSeparatorIterator).join( - itemValues.stream().map(v -> varNamePiece + valuePairEquals + v).collect(toList()) - ); + return prefixSeparatorIterator.next() + itemValues.stream().map(v -> varNamePiece + valuePairEquals + v).collect(Collectors.joining(prefixSeparatorIterator.next())); } private static String rfc6570MapExpansion( Map inData, boolean explode, boolean percentEncode, - Object prefixSeparatorIterator, // todo fix this + PrefixSeparatorIterator prefixSeparatorIterator, String varNamePiece, boolean namedParameterExpansion ) { @@ -129,29 +128,21 @@ private static String rfc6570MapExpansion( } var valuePairEquals = namedParameterExpansion ? "=" : ""; if (!explode) { - return ( - next(prefixSeparatorIterator) + - varNamePiece + - valuePairEquals + - prefixSeparatorIterator.itemSeparator.join( - prefixSeparatorIterator.itemSeparator.join( - inDataMap.entrySet().stream().map(e -> List.of(e.getKey(), e.getValue())) - ) - ) - ); + return prefixSeparatorIterator.next() + + varNamePiece + + valuePairEquals + + inDataMap.entrySet().stream().map(e -> e.getKey()+prefixSeparatorIterator.itemSeparator+e.getValue()).collect(Collectors.joining(prefixSeparatorIterator.itemSeparator)); } // exploded - return next(prefixSeparatorIterator) + next(prefixSeparatorIterator).join( - inDataMap.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(toList()) - ); + return prefixSeparatorIterator.next() + inDataMap.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining(prefixSeparatorIterator.next())); } - public static String rfc6570Expansion( + protected static String rfc6570Expansion( String variableName, @Nullable Object inData, boolean explode, boolean percentEncode, - Object prefixSeparatorIterator // todo fix this + PrefixSeparatorIterator prefixSeparatorIterator ) { /* Separator is for separate variables like dict with explode true, diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/PrefixSeparatorIterator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/PrefixSeparatorIterator.java new file mode 100644 index 00000000000..89e3ccd8d43 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/PrefixSeparatorIterator.java @@ -0,0 +1,27 @@ +package org.openapijsonschematools.client.parameter; + +import java.util.Set; + +public class PrefixSeparatorIterator { + // A class to store prefixes and separators for rfc6570 expansions + public final String prefix; + public final String separator; + private boolean first; + public final String itemSeparator; + private static final Set reusedSeparators = Set.of(".", "|", "%20"); + + public PrefixSeparatorIterator(String prefix, String separator) { + this.prefix = prefix; + this.separator = separator; + itemSeparator = reusedSeparators.contains(separator) ? separator : ","; + first = true; + } + + public String next() { + if (first) { + first = false; + return prefix; + } + return separator; + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSimpleSerializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSimpleSerializer.java new file mode 100644 index 00000000000..d5b3968c77e --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSimpleSerializer.java @@ -0,0 +1,21 @@ +package org.openapijsonschematools.client.parameter; + +import org.checkerframework.checker.nullness.qual.Nullable; + +public class StyleSimpleSerializer extends ParameterSerializerBase { + public static String serializeSimple( + @Nullable Object inData, + String name, + boolean explode, + boolean percentEncode + ) { + var prefixSeparatorIterator = new PrefixSeparatorIterator("", ","); + return rfc6570Expansion( + name, + inData, + explode, + percentEncode, + prefixSeparatorIterator + ); + } +} diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 7c1a35ae9a5..b1df4df29c3 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -773,6 +773,23 @@ public void processOpts() { "src/main/java/packagename/parameter/ParameterStyle.hbs", packagePath() + File.separatorChar + "parameter", "ParameterStyle.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/parameter/ParameterSerializerBase.hbs", + packagePath() + File.separatorChar + "parameter", + "ParameterSerializerBase.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/parameter/PrefixSeparatorIterator.hbs", + packagePath() + File.separatorChar + "parameter", + "PrefixSeparatorIterator.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/parameter/StyleSimpleSerializer.hbs", + packagePath() + File.separatorChar + "parameter", + "StyleSimpleSerializer.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/parameter/ParameterBase.hbs", + packagePath() + File.separatorChar + "parameter", + "ParameterBase.java")); + // response supportingFiles.add(new SupportingFile( "src/main/java/packagename/response/ApiResponse.hbs", diff --git a/src/main/resources/java/src/main/java/packagename/header/Header.hbs b/src/main/resources/java/src/main/java/packagename/header/Header.hbs new file mode 100644 index 00000000000..2623a552a12 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/header/Header.hbs @@ -0,0 +1,37 @@ +package {{{packageName}}}.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.configurations.SchemaConfiguration; +import {{{packageName}}}.mediatype.MediaType; +import {{{packageName}}}.parameter.ParameterBase; +import {{{packageName}}}.parameter.ParameterInType; +import {{{packageName}}}.parameter.ParameterStyle; +import {{{packageName}}}.parameter.StyleSimpleSerializer; +import {{{packageName}}}.schemas.validation.JsonSchema; + +import java.net.http.HttpHeaders; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class Header extends ParameterBase { + public Header(boolean required, @Nullable boolean allowReserved, JsonSchema schema, @Nullable Map> content) { + super(ParameterInType.HEADER, required, ParameterStyle.SIMPLE, false, allowReserved, schema, content); + } + + private static HttpHeaders toHeaders(String name, String value) { + Map> map = Map.of(name, List.of(value)); + BiPredicate headerFilter = (key, val) -> true; + return HttpHeaders.of(map, headerFilter); + } + + public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { + if (schema != null) { + var castInData = skipValidation ? inData : schema.validate(inData, configuration); + var value = StyleSimpleSerializer.serializeSimple(castInData, name, explode, false); + return toHeaders(name, value); + } else { + throw new RuntimeException("Serializing header with content has not yet been implemented"); + } + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/parameter/ParameterBase.hbs b/src/main/resources/java/src/main/java/packagename/parameter/ParameterBase.hbs new file mode 100644 index 00000000000..337f7e0ed9c --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/parameter/ParameterBase.hbs @@ -0,0 +1,27 @@ +package {{{packageName}}}.parameter; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.mediatype.MediaType; +import {{{packageName}}}.schemas.validation.JsonSchema; + +import java.util.Map; + +public class ParameterBase { + public final ParameterInType inType; + public final boolean required; + public final @Nullable ParameterStyle style; + public final @Nullable boolean explode; + public final @Nullable boolean allowReserved; + public final @Nullable JsonSchema schema; + public final @Nullable Map> content; + + public ParameterBase(ParameterInType inType, boolean required, @Nullable ParameterStyle style, @Nullable boolean explode, @Nullable boolean allowReserved, JsonSchema schema, @Nullable Map> content) { + this.inType = inType; + this.required = required; + this.style = style; + this.explode = explode; + this.allowReserved = allowReserved; + this.schema = schema; + this.content = content; + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/parameter/ParameterInType b/src/main/resources/java/src/main/java/packagename/parameter/ParameterInType new file mode 100644 index 00000000000..3b4e45cbfb7 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/parameter/ParameterInType @@ -0,0 +1,8 @@ +package {{{packageName}}}.parameter; + +public enum ParameterInType { + QUERY, + HEADER, + PATH, + COOKIE +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/parameter/StyleSerializerBase.hbs b/src/main/resources/java/src/main/java/packagename/parameter/ParameterSerializerBase.hbs similarity index 80% rename from src/main/resources/java/src/main/java/packagename/parameter/StyleSerializerBase.hbs rename to src/main/resources/java/src/main/java/packagename/parameter/ParameterSerializerBase.hbs index 98ae8d3e83f..b964d623ea9 100644 --- a/src/main/resources/java/src/main/java/packagename/parameter/StyleSerializerBase.hbs +++ b/src/main/resources/java/src/main/java/packagename/parameter/ParameterSerializerBase.hbs @@ -6,11 +6,12 @@ import {{{packageName}}}.exceptions.InvalidTypeException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.AbstractMap; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.HashMap; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; @@ -63,27 +64,27 @@ public class ParameterSerializerBase { } throw new InvalidTypeException("Unable to generate a rfc6570 item representation of "+item); } - + private static String rfc6570StrNumberExpansion( @Nullable Object inData, boolean percentEncode, - Object prefixSeparatorIterator, // todo fix this + PrefixSeparatorIterator prefixSeparatorIterator, String varNamePiece, boolean namedParameterExpansion ) { var itemValue = rfc6570ItemValue(inData, percentEncode); - if (itemValue == null || (itemValue.isEmpty() && prefixSeparatorIterator.separator == ';')) { - return next(prefixSeparatorIterator) + varNamePiece; + if (itemValue == null || (itemValue.isEmpty() && prefixSeparatorIterator.separator.equals(";"))) { + return prefixSeparatorIterator.next() + varNamePiece; } var valuePairEquals = namedParameterExpansion ? "=" : ""; - return next(prefixSeparatorIterator) + varNamePiece + valuePairEquals + itemValue; + return prefixSeparatorIterator.next() + varNamePiece + valuePairEquals + itemValue; } private static String rfc6570ListExpansion( List inData, boolean explode, boolean percentEncode, - Object prefixSeparatorIterator, // todo fix this + PrefixSeparatorIterator prefixSeparatorIterator, String varNamePiece, boolean namedParameterExpansion ) { @@ -98,23 +99,21 @@ public class ParameterSerializerBase { var valuePairEquals = namedParameterExpansion ? "=" : ""; if (!explode) { return ( - next(prefixSeparatorIterator) + + prefixSeparatorIterator.next() + varNamePiece + valuePairEquals + - prefixSeparatorIterator.itemSeparator.join(itemValues) + String.join(prefixSeparatorIterator.itemSeparator, itemValues) ); } // exploded - return next(prefixSeparatorIterator) + next(prefixSeparatorIterator).join( - itemValues.stream().map(v -> varNamePiece + valuePairEquals + v).collect(toList()) - ); + return prefixSeparatorIterator.next() + itemValues.stream().map(v -> varNamePiece + valuePairEquals + v).collect(Collectors.joining(prefixSeparatorIterator.next())); } private static String rfc6570MapExpansion( Map inData, boolean explode, boolean percentEncode, - Object prefixSeparatorIterator, // todo fix this + PrefixSeparatorIterator prefixSeparatorIterator, String varNamePiece, boolean namedParameterExpansion ) { @@ -129,29 +128,21 @@ public class ParameterSerializerBase { } var valuePairEquals = namedParameterExpansion ? "=" : ""; if (!explode) { - return ( - next(prefixSeparatorIterator) + - varNamePiece + - valuePairEquals + - prefixSeparatorIterator.itemSeparator.join( - prefixSeparatorIterator.itemSeparator.join( - inDataMap.entrySet().stream().map(e -> List.of(e.getKey(), e.getValue())) - ) - ) - ); + return prefixSeparatorIterator.next() + + varNamePiece + + valuePairEquals + + inDataMap.entrySet().stream().map(e -> e.getKey()+prefixSeparatorIterator.itemSeparator+e.getValue()).collect(Collectors.joining(prefixSeparatorIterator.itemSeparator)); } // exploded - return next(prefixSeparatorIterator) + next(prefixSeparatorIterator).join( - inDataMap.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(toList()) - ); + return prefixSeparatorIterator.next() + inDataMap.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining(prefixSeparatorIterator.next())); } - public static String rfc6570Expansion( + protected static String rfc6570Expansion( String variableName, @Nullable Object inData, boolean explode, boolean percentEncode, - Object prefixSeparatorIterator // todo fix this + PrefixSeparatorIterator prefixSeparatorIterator ) { /* Separator is for separate variables like dict with explode true, diff --git a/src/main/resources/java/src/main/java/packagename/parameter/PrefixSeparatorIterator.hbs b/src/main/resources/java/src/main/java/packagename/parameter/PrefixSeparatorIterator.hbs new file mode 100644 index 00000000000..5d38502e957 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/parameter/PrefixSeparatorIterator.hbs @@ -0,0 +1,27 @@ +package {{{packageName}}}.parameter; + +import java.util.Set; + +public class PrefixSeparatorIterator { + // A class to store prefixes and separators for rfc6570 expansions + public final String prefix; + public final String separator; + private boolean first; + public final String itemSeparator; + private static final Set reusedSeparators = Set.of(".", "|", "%20"); + + public PrefixSeparatorIterator(String prefix, String separator) { + this.prefix = prefix; + this.separator = separator; + itemSeparator = reusedSeparators.contains(separator) ? separator : ","; + first = true; + } + + public String next() { + if (first) { + first = false; + return prefix; + } + return separator; + } +} diff --git a/src/main/resources/java/src/main/java/packagename/parameter/StyleSimpleSerializer.hbs b/src/main/resources/java/src/main/java/packagename/parameter/StyleSimpleSerializer.hbs new file mode 100644 index 00000000000..1b80c0ffdbf --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/parameter/StyleSimpleSerializer.hbs @@ -0,0 +1,21 @@ +package {{{packageName}}}.parameter; + +import org.checkerframework.checker.nullness.qual.Nullable; + +public class StyleSimpleSerializer extends ParameterSerializerBase { + public static String serializeSimple( + @Nullable Object inData, + String name, + boolean explode, + boolean percentEncode + ) { + var prefixSeparatorIterator = new PrefixSeparatorIterator("", ","); + return rfc6570Expansion( + name, + inData, + explode, + percentEncode, + prefixSeparatorIterator + ); + } +} From 96829800dbc1738f62a9eb0a95a75971e88c186d Mon Sep 17 00:00:00 2001 From: Justin Black Date: Wed, 28 Feb 2024 10:46:48 -0800 Subject: [PATCH 03/32] Removes 2 unneeded classes --- .../petstore/java/.openapi-generator/FILES | 9 +++++ .../client/header/Header.java | 37 ------------------- .../client/header/HeaderBase.java | 18 +++++++++ .../PrefixSeparatorIterator.java | 2 +- .../Rfc6570Serializer.java} | 10 ++--- .../client/header/SchemaHeader.java | 32 ++++++++++++++++ .../StyleSimpleSerializer.java | 4 +- .../client/mediatype/Encoding.java | 2 +- .../client/parameter/ParameterInType.java | 2 +- .../generators/JavaClientGenerator.java | 34 ++++++++++++----- .../main/java/packagename/header/Header.hbs | 37 ------------------- .../java/packagename/header/HeaderBase.hbs | 18 +++++++++ .../PrefixSeparatorIterator.hbs | 2 +- .../Rfc6570Serializer.hbs} | 8 ++-- .../java/packagename/header/SchemaHeader.hbs | 32 ++++++++++++++++ .../StyleSimpleSerializer.hbs | 4 +- .../{ParameterInType => ParameterInType.hbs} | 0 17 files changed, 150 insertions(+), 101 deletions(-) delete mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/{parameter => header}/PrefixSeparatorIterator.java (93%) rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/{parameter/ParameterSerializerBase.java => header/Rfc6570Serializer.java} (95%) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/{parameter => header}/StyleSimpleSerializer.java (80%) delete mode 100644 src/main/resources/java/src/main/java/packagename/header/Header.hbs create mode 100644 src/main/resources/java/src/main/java/packagename/header/HeaderBase.hbs rename src/main/resources/java/src/main/java/packagename/{parameter => header}/PrefixSeparatorIterator.hbs (95%) rename src/main/resources/java/src/main/java/packagename/{parameter/ParameterSerializerBase.hbs => header/Rfc6570Serializer.hbs} (96%) create mode 100644 src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs rename src/main/resources/java/src/main/java/packagename/{parameter => header}/StyleSimpleSerializer.hbs (82%) rename src/main/resources/java/src/main/java/packagename/parameter/{ParameterInType => ParameterInType.hbs} (100%) diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index cdbb89acbeb..286a3d550f5 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -511,8 +511,17 @@ src/main/java/org/openapijsonschematools/client/exceptions/InvalidAdditionalProp src/main/java/org/openapijsonschematools/client/exceptions/InvalidTypeException.java src/main/java/org/openapijsonschematools/client/exceptions/UnsetPropertyException.java src/main/java/org/openapijsonschematools/client/exceptions/ValidationException.java +src/main/java/org/openapijsonschematools/client/header/ContentHeaderBase.java +src/main/java/org/openapijsonschematools/client/header/HeaderBase.java +src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java +src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java +src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java +src/main/java/org/openapijsonschematools/client/header/SchemaHeaderBase.java +src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java src/main/java/org/openapijsonschematools/client/mediatype/MediaType.java +src/main/java/org/openapijsonschematools/client/parameter/ParameterBase.java +src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java src/main/java/org/openapijsonschematools/client/parameter/ParameterStyle.java src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/RequestBody.java src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/Responses.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java deleted file mode 100644 index da0338fe232..00000000000 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.openapijsonschematools.client.header; - -import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.mediatype.MediaType; -import org.openapijsonschematools.client.parameter.ParameterBase; -import org.openapijsonschematools.client.parameter.ParameterInType; -import org.openapijsonschematools.client.parameter.ParameterStyle; -import org.openapijsonschematools.client.parameter.StyleSimpleSerializer; -import org.openapijsonschematools.client.schemas.validation.JsonSchema; - -import java.net.http.HttpHeaders; -import java.util.List; -import java.util.Map; -import java.util.function.BiPredicate; - -public class Header extends ParameterBase { - public Header(boolean required, @Nullable boolean allowReserved, JsonSchema schema, @Nullable Map> content) { - super(ParameterInType.HEADER, required, ParameterStyle.SIMPLE, false, allowReserved, schema, content); - } - - private static HttpHeaders toHeaders(String name, String value) { - Map> map = Map.of(name, List.of(value)); - BiPredicate headerFilter = (key, val) -> true; - return HttpHeaders.of(map, headerFilter); - } - - public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { - if (schema != null) { - var castInData = skipValidation ? inData : schema.validate(inData, configuration); - var value = StyleSimpleSerializer.serializeSimple(castInData, name, explode, false); - return toHeaders(name, value); - } else { - throw new RuntimeException("Serializing header with content has not yet been implemented"); - } - } -} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java new file mode 100644 index 00000000000..e44ce034fdf --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.parameter.ParameterStyle; + +public class HeaderBase { + public final boolean required; + public final @Nullable ParameterStyle style; + public final @Nullable boolean explode; + public final @Nullable boolean allowReserved; + + public HeaderBase(boolean required, @Nullable ParameterStyle style, @Nullable boolean explode, @Nullable boolean allowReserved) { + this.required = required; + this.style = style; + this.explode = explode; + this.allowReserved = allowReserved; + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/PrefixSeparatorIterator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java similarity index 93% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/PrefixSeparatorIterator.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java index 89e3ccd8d43..522e71dfce4 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/PrefixSeparatorIterator.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java @@ -1,4 +1,4 @@ -package org.openapijsonschematools.client.parameter; +package org.openapijsonschematools.client.header; import java.util.Set; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterSerializerBase.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java similarity index 95% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterSerializerBase.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java index 578216ca795..423ffccbea7 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterSerializerBase.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java @@ -1,4 +1,4 @@ -package org.openapijsonschematools.client.parameter; +package org.openapijsonschematools.client.header; import org.checkerframework.checker.nullness.qual.Nullable; import org.openapijsonschematools.client.exceptions.InvalidTypeException; @@ -6,9 +6,9 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.AbstractMap; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.HashMap; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -16,7 +16,7 @@ import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; -public class ParameterSerializerBase { +public class Rfc6570Serializer { private static final String ENCODING = "UTF-8"; private static final Set namedParameterSeparators = Set.of("&", ";"); @@ -56,10 +56,10 @@ private static String percentEncode(String s) { // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 return null; } else if (item instanceof List && ((List) item).isEmpty()) { - // // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 return null; } else if (item instanceof Map && ((Map) item).isEmpty()) { - // // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 return null; } throw new InvalidTypeException("Unable to generate a rfc6570 item representation of "+item); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java new file mode 100644 index 00000000000..1614b5d7bea --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java @@ -0,0 +1,32 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.parameter.ParameterStyle; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; + +import java.net.http.HttpHeaders; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class SchemaHeader extends HeaderBase { + public final JsonSchema schema; + + public SchemaHeader(boolean required, @Nullable boolean allowReserved, JsonSchema schema) { + super(required, ParameterStyle.SIMPLE, false, allowReserved); + this.schema = schema; + } + + private static HttpHeaders toHeaders(String name, String value) { + Map> map = Map.of(name, List.of(value)); + BiPredicate headerFilter = (key, val) -> true; + return HttpHeaders.of(map, headerFilter); + } + + public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { + var castInData = skipValidation ? inData : schema.validate(inData, configuration); + var value = StyleSimpleSerializer.serializeSimple(castInData, name, explode, false); + return toHeaders(name, value); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSimpleSerializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java similarity index 80% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSimpleSerializer.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java index d5b3968c77e..1c8d5d7a27d 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/StyleSimpleSerializer.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java @@ -1,8 +1,8 @@ -package org.openapijsonschematools.client.parameter; +package org.openapijsonschematools.client.header; import org.checkerframework.checker.nullness.qual.Nullable; -public class StyleSimpleSerializer extends ParameterSerializerBase { +public class StyleSimpleSerializer extends Rfc6570Serializer { public static String serializeSimple( @Nullable Object inData, String name, diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java index b6c6d309896..d36fae2df8a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java @@ -7,7 +7,7 @@ public class Encoding { public final String contentType; - public final @Nullable Map headers; // todo change value to Header + public final @Nullable Map headers; // todo change value to HeaderParameter public final @Nullable ParameterStyle style; public final boolean explode; public final boolean allowReserved; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java index 94fa042f27c..cb8f4b18ba2 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java @@ -5,4 +5,4 @@ public enum ParameterInType { HEADER, PATH, COOKIE -} +} \ No newline at end of file diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index b1df4df29c3..59dcf36a6d8 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -768,23 +768,37 @@ public void processOpts() { "src/main/java/packagename/mediatype/Encoding.hbs", packagePath() + File.separatorChar + "mediatype", "Encoding.java")); + // header + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/header/HeaderBase.hbs", + packagePath() + File.separatorChar + "header", + "HeaderBase.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/header/SchemaHeader.hbs", + packagePath() + File.separatorChar + "header", + "SchemaHeader.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/header/StyleSimpleSerializer.hbs", + packagePath() + File.separatorChar + "header", + "StyleSimpleSerializer.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/header/Rfc6570Serializer.hbs", + packagePath() + File.separatorChar + "header", + "Rfc6570Serializer.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/header/PrefixSeparatorIterator.hbs", + packagePath() + File.separatorChar + "header", + "PrefixSeparatorIterator.java")); + // parameter supportingFiles.add(new SupportingFile( "src/main/java/packagename/parameter/ParameterStyle.hbs", packagePath() + File.separatorChar + "parameter", "ParameterStyle.java")); supportingFiles.add(new SupportingFile( - "src/main/java/packagename/parameter/ParameterSerializerBase.hbs", - packagePath() + File.separatorChar + "parameter", - "ParameterSerializerBase.java")); - supportingFiles.add(new SupportingFile( - "src/main/java/packagename/parameter/PrefixSeparatorIterator.hbs", + "src/main/java/packagename/parameter/ParameterInType.hbs", packagePath() + File.separatorChar + "parameter", - "PrefixSeparatorIterator.java")); - supportingFiles.add(new SupportingFile( - "src/main/java/packagename/parameter/StyleSimpleSerializer.hbs", - packagePath() + File.separatorChar + "parameter", - "StyleSimpleSerializer.java")); + "ParameterInType.java")); supportingFiles.add(new SupportingFile( "src/main/java/packagename/parameter/ParameterBase.hbs", packagePath() + File.separatorChar + "parameter", diff --git a/src/main/resources/java/src/main/java/packagename/header/Header.hbs b/src/main/resources/java/src/main/java/packagename/header/Header.hbs deleted file mode 100644 index 2623a552a12..00000000000 --- a/src/main/resources/java/src/main/java/packagename/header/Header.hbs +++ /dev/null @@ -1,37 +0,0 @@ -package {{{packageName}}}.header; - -import org.checkerframework.checker.nullness.qual.Nullable; -import {{{packageName}}}.configurations.SchemaConfiguration; -import {{{packageName}}}.mediatype.MediaType; -import {{{packageName}}}.parameter.ParameterBase; -import {{{packageName}}}.parameter.ParameterInType; -import {{{packageName}}}.parameter.ParameterStyle; -import {{{packageName}}}.parameter.StyleSimpleSerializer; -import {{{packageName}}}.schemas.validation.JsonSchema; - -import java.net.http.HttpHeaders; -import java.util.List; -import java.util.Map; -import java.util.function.BiPredicate; - -public class Header extends ParameterBase { - public Header(boolean required, @Nullable boolean allowReserved, JsonSchema schema, @Nullable Map> content) { - super(ParameterInType.HEADER, required, ParameterStyle.SIMPLE, false, allowReserved, schema, content); - } - - private static HttpHeaders toHeaders(String name, String value) { - Map> map = Map.of(name, List.of(value)); - BiPredicate headerFilter = (key, val) -> true; - return HttpHeaders.of(map, headerFilter); - } - - public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { - if (schema != null) { - var castInData = skipValidation ? inData : schema.validate(inData, configuration); - var value = StyleSimpleSerializer.serializeSimple(castInData, name, explode, false); - return toHeaders(name, value); - } else { - throw new RuntimeException("Serializing header with content has not yet been implemented"); - } - } -} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/header/HeaderBase.hbs b/src/main/resources/java/src/main/java/packagename/header/HeaderBase.hbs new file mode 100644 index 00000000000..60a3dc1ffe1 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/header/HeaderBase.hbs @@ -0,0 +1,18 @@ +package {{{packageName}}}.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.parameter.ParameterStyle; + +public class HeaderBase { + public final boolean required; + public final @Nullable ParameterStyle style; + public final @Nullable boolean explode; + public final @Nullable boolean allowReserved; + + public HeaderBase(boolean required, @Nullable ParameterStyle style, @Nullable boolean explode, @Nullable boolean allowReserved) { + this.required = required; + this.style = style; + this.explode = explode; + this.allowReserved = allowReserved; + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/parameter/PrefixSeparatorIterator.hbs b/src/main/resources/java/src/main/java/packagename/header/PrefixSeparatorIterator.hbs similarity index 95% rename from src/main/resources/java/src/main/java/packagename/parameter/PrefixSeparatorIterator.hbs rename to src/main/resources/java/src/main/java/packagename/header/PrefixSeparatorIterator.hbs index 5d38502e957..a1c542e9408 100644 --- a/src/main/resources/java/src/main/java/packagename/parameter/PrefixSeparatorIterator.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/PrefixSeparatorIterator.hbs @@ -1,4 +1,4 @@ -package {{{packageName}}}.parameter; +package {{{packageName}}}.header; import java.util.Set; diff --git a/src/main/resources/java/src/main/java/packagename/parameter/ParameterSerializerBase.hbs b/src/main/resources/java/src/main/java/packagename/header/Rfc6570Serializer.hbs similarity index 96% rename from src/main/resources/java/src/main/java/packagename/parameter/ParameterSerializerBase.hbs rename to src/main/resources/java/src/main/java/packagename/header/Rfc6570Serializer.hbs index b964d623ea9..182b5355ee1 100644 --- a/src/main/resources/java/src/main/java/packagename/parameter/ParameterSerializerBase.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/Rfc6570Serializer.hbs @@ -1,4 +1,4 @@ -package {{{packageName}}}.parameter; +package {{{packageName}}}.header; import org.checkerframework.checker.nullness.qual.Nullable; import {{{packageName}}}.exceptions.InvalidTypeException; @@ -16,7 +16,7 @@ import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; -public class ParameterSerializerBase { +public class Rfc6570Serializer { private static final String ENCODING = "UTF-8"; private static final Set namedParameterSeparators = Set.of("&", ";"); @@ -56,10 +56,10 @@ public class ParameterSerializerBase { // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 return null; } else if (item instanceof List && ((List) item).isEmpty()) { - // // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 return null; } else if (item instanceof Map && ((Map) item).isEmpty()) { - // // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 return null; } throw new InvalidTypeException("Unable to generate a rfc6570 item representation of "+item); diff --git a/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs b/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs new file mode 100644 index 00000000000..579ededda4b --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs @@ -0,0 +1,32 @@ +package {{{packageName}}}.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.configurations.SchemaConfiguration; +import {{{packageName}}}.parameter.ParameterStyle; +import {{{packageName}}}.schemas.validation.JsonSchema; + +import java.net.http.HttpHeaders; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class SchemaHeader extends HeaderBase { + public final JsonSchema schema; + + public SchemaHeader(boolean required, @Nullable boolean allowReserved, JsonSchema schema) { + super(required, ParameterStyle.SIMPLE, false, allowReserved); + this.schema = schema; + } + + private static HttpHeaders toHeaders(String name, String value) { + Map> map = Map.of(name, List.of(value)); + BiPredicate headerFilter = (key, val) -> true; + return HttpHeaders.of(map, headerFilter); + } + + public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { + var castInData = skipValidation ? inData : schema.validate(inData, configuration); + var value = StyleSimpleSerializer.serializeSimple(castInData, name, explode, false); + return toHeaders(name, value); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/parameter/StyleSimpleSerializer.hbs b/src/main/resources/java/src/main/java/packagename/header/StyleSimpleSerializer.hbs similarity index 82% rename from src/main/resources/java/src/main/java/packagename/parameter/StyleSimpleSerializer.hbs rename to src/main/resources/java/src/main/java/packagename/header/StyleSimpleSerializer.hbs index 1b80c0ffdbf..d4a1b2173fe 100644 --- a/src/main/resources/java/src/main/java/packagename/parameter/StyleSimpleSerializer.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/StyleSimpleSerializer.hbs @@ -1,8 +1,8 @@ -package {{{packageName}}}.parameter; +package {{{packageName}}}.header; import org.checkerframework.checker.nullness.qual.Nullable; -public class StyleSimpleSerializer extends ParameterSerializerBase { +public class StyleSimpleSerializer extends Rfc6570Serializer { public static String serializeSimple( @Nullable Object inData, String name, diff --git a/src/main/resources/java/src/main/java/packagename/parameter/ParameterInType b/src/main/resources/java/src/main/java/packagename/parameter/ParameterInType.hbs similarity index 100% rename from src/main/resources/java/src/main/java/packagename/parameter/ParameterInType rename to src/main/resources/java/src/main/java/packagename/parameter/ParameterInType.hbs From d07883569841708c6779cc54ff88968cc5ff5624 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Wed, 28 Feb 2024 10:52:58 -0800 Subject: [PATCH 04/32] Adds Header interface --- .../openapijsonschematools/client/header/Header.java | 10 ++++++++++ .../client/header/SchemaHeader.java | 3 ++- .../codegen/generators/JavaClientGenerator.java | 4 ++++ .../java/src/main/java/packagename/header/Header.hbs | 10 ++++++++++ .../src/main/java/packagename/header/SchemaHeader.hbs | 3 ++- 5 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java create mode 100644 src/main/resources/java/src/main/java/packagename/header/Header.hbs diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java new file mode 100644 index 00000000000..85cb6fd1dbe --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java @@ -0,0 +1,10 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; + +import java.net.http.HttpHeaders; + +public interface Header { + HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration); +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java index 1614b5d7bea..f1ae1f94d9d 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java @@ -10,7 +10,7 @@ import java.util.Map; import java.util.function.BiPredicate; -public class SchemaHeader extends HeaderBase { +public class SchemaHeader extends HeaderBase implements Header { public final JsonSchema schema; public SchemaHeader(boolean required, @Nullable boolean allowReserved, JsonSchema schema) { @@ -24,6 +24,7 @@ private static HttpHeaders toHeaders(String name, String value) { return HttpHeaders.of(map, headerFilter); } + @Override public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { var castInData = skipValidation ? inData : schema.validate(inData, configuration); var value = StyleSimpleSerializer.serializeSimple(castInData, name, explode, false); diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 59dcf36a6d8..6ad99f708eb 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -769,6 +769,10 @@ public void processOpts() { packagePath() + File.separatorChar + "mediatype", "Encoding.java")); // header + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/header/Header.hbs", + packagePath() + File.separatorChar + "header", + "Header.java")); supportingFiles.add(new SupportingFile( "src/main/java/packagename/header/HeaderBase.hbs", packagePath() + File.separatorChar + "header", diff --git a/src/main/resources/java/src/main/java/packagename/header/Header.hbs b/src/main/resources/java/src/main/java/packagename/header/Header.hbs new file mode 100644 index 00000000000..142664bbfc0 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/header/Header.hbs @@ -0,0 +1,10 @@ +package {{{packageName}}}.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.configurations.SchemaConfiguration; + +import java.net.http.HttpHeaders; + +public interface Header { + HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration); +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs b/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs index 579ededda4b..92269547e5c 100644 --- a/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs @@ -10,7 +10,7 @@ import java.util.List; import java.util.Map; import java.util.function.BiPredicate; -public class SchemaHeader extends HeaderBase { +public class SchemaHeader extends HeaderBase implements Header { public final JsonSchema schema; public SchemaHeader(boolean required, @Nullable boolean allowReserved, JsonSchema schema) { @@ -24,6 +24,7 @@ public class SchemaHeader extends HeaderBase { return HttpHeaders.of(map, headerFilter); } + @Override public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { var castInData = skipValidation ? inData : schema.validate(inData, configuration); var value = StyleSimpleSerializer.serializeSimple(castInData, name, explode, false); From 34e79e5066639300ed892b82ff17ebec0e2d587d Mon Sep 17 00:00:00 2001 From: Justin Black Date: Wed, 28 Feb 2024 12:26:13 -0800 Subject: [PATCH 05/32] Adds header serialization test --- .../petstore/java/.openapi-generator/FILES | 4 +- .../client/header/HeaderBase.java | 6 +- .../client/header/Rfc6570Serializer.java | 6 +- .../client/header/SchemaHeader.java | 7 +- .../client/header/SchemaHeaderTest.java | 108 ++++++++++++++++++ .../generators/JavaClientGenerator.java | 4 + .../java/packagename/header/HeaderBase.hbs | 6 +- .../packagename/header/Rfc6570Serializer.hbs | 6 +- .../java/packagename/header/SchemaHeader.hbs | 7 +- .../packagename/header/SchemaHeaderTest.hbs | 108 ++++++++++++++++++ 10 files changed, 242 insertions(+), 20 deletions(-) create mode 100644 samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java create mode 100644 src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 286a3d550f5..86b0a49e8b8 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -511,12 +511,11 @@ src/main/java/org/openapijsonschematools/client/exceptions/InvalidAdditionalProp src/main/java/org/openapijsonschematools/client/exceptions/InvalidTypeException.java src/main/java/org/openapijsonschematools/client/exceptions/UnsetPropertyException.java src/main/java/org/openapijsonschematools/client/exceptions/ValidationException.java -src/main/java/org/openapijsonschematools/client/header/ContentHeaderBase.java +src/main/java/org/openapijsonschematools/client/header/Header.java src/main/java/org/openapijsonschematools/client/header/HeaderBase.java src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java -src/main/java/org/openapijsonschematools/client/header/SchemaHeaderBase.java src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java src/main/java/org/openapijsonschematools/client/mediatype/MediaType.java @@ -1075,6 +1074,7 @@ src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.j src/main/java/org/openapijsonschematools/client/servers/server0/Variables.java src/main/java/org/openapijsonschematools/client/servers/server1/Variables.java src/test/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlagsTest.java +src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java src/test/java/org/openapijsonschematools/client/schemas/AnyTypeSchemaTest.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java index e44ce034fdf..23f22ebcf39 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java @@ -6,10 +6,10 @@ public class HeaderBase { public final boolean required; public final @Nullable ParameterStyle style; - public final @Nullable boolean explode; - public final @Nullable boolean allowReserved; + public final @Nullable Boolean explode; + public final @Nullable Boolean allowReserved; - public HeaderBase(boolean required, @Nullable ParameterStyle style, @Nullable boolean explode, @Nullable boolean allowReserved) { + public HeaderBase(boolean required, @Nullable ParameterStyle style, @Nullable Boolean explode, @Nullable Boolean allowReserved) { this.required = required; this.style = style; this.explode = explode; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java index 423ffccbea7..7bac0c8a6be 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java @@ -6,7 +6,7 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.AbstractMap; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -64,7 +64,7 @@ private static String percentEncode(String s) { } throw new InvalidTypeException("Unable to generate a rfc6570 item representation of "+item); } - + private static String rfc6570StrNumberExpansion( @Nullable Object inData, boolean percentEncode, @@ -120,7 +120,7 @@ private static String rfc6570MapExpansion( var inDataMap = inData.entrySet().stream() .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), rfc6570ItemValue(entry.getValue(), percentEncode))) .filter(entry -> entry.getValue() != null) - .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, HashMap::new)); + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new)); if (inDataMap.isEmpty()) { // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java index f1ae1f94d9d..ae060abaaba 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java @@ -13,8 +13,8 @@ public class SchemaHeader extends HeaderBase implements Header { public final JsonSchema schema; - public SchemaHeader(boolean required, @Nullable boolean allowReserved, JsonSchema schema) { - super(required, ParameterStyle.SIMPLE, false, allowReserved); + public SchemaHeader(boolean required, @Nullable Boolean allowReserved, @Nullable Boolean explode, JsonSchema schema) { + super(required, ParameterStyle.SIMPLE, explode, allowReserved); this.schema = schema; } @@ -27,7 +27,8 @@ private static HttpHeaders toHeaders(String name, String value) { @Override public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { var castInData = skipValidation ? inData : schema.validate(inData, configuration); - var value = StyleSimpleSerializer.serializeSimple(castInData, name, explode, false); + boolean usedExplode = explode != null && explode; + var value = StyleSimpleSerializer.serializeSimple(castInData, name, usedExplode, false); return toHeaders(name, value); } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java new file mode 100644 index 00000000000..d2071dae74d --- /dev/null +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java @@ -0,0 +1,108 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; + +import java.net.http.HttpHeaders; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiPredicate; + +public class SchemaHeaderTest { + public record ParamTestCase(@Nullable Object payload, Map> expectedSerialization, @Nullable Boolean explode) { + public ParamTestCase(@Nullable Object payload, Map> expectedSerialization) { + this(payload, expectedSerialization, null); + } + } + + @Test + public void testSerialization() { + var mapPayload = new LinkedHashMap(); + mapPayload.put("R", 100); + mapPayload.put("G", 200); + mapPayload.put("B", 150); + var testCases = List.of( + new ParamTestCase( + null, + Map.of("color", List.of("")) + ), + new ParamTestCase( + 1, + Map.of("color", List.of("1")) + ), + new ParamTestCase( + 3.14, + Map.of("color",List.of("3.14")) + ), + new ParamTestCase( + "blue", + Map.of("color", List.of("blue")) + ), + new ParamTestCase( + "hello world", + Map.of("color", List.of("hello world")) + ), + new ParamTestCase( + "", + Map.of("color", List.of("")) + ), + new ParamTestCase( + List.of(), + Map.of("color", List.of("")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("blue,black,brown")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("blue,black,brown")), + true + ), + new ParamTestCase( + Map.of(), + Map.of("color", List.of("")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("R,100,G,200,B,150")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("R=100,G=200,B=150")), + true + ) + ); + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + BiPredicate headerFilter = (key, val) -> true; + for (ParamTestCase testCase: testCases) { + var header = new SchemaHeader( + true, + false, + testCase.explode, + AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance() + ); + var serialization = header.serialize(testCase.payload, "color", true, configuration); + Assert.assertEquals(HttpHeaders.of(testCase.expectedSerialization, headerFilter), serialization); + } + SchemaHeader boolHeader = new SchemaHeader( + true, + false, + false, + AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance() + ); + for (boolean value: Set.of(true, false)) { + Assert.assertThrows( + InvalidTypeException.class, + () -> boolHeader.serialize(value, "color", true, configuration) + ); + } + } +} diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 6ad99f708eb..3e44d87c38c 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -793,6 +793,10 @@ public void processOpts() { "src/main/java/packagename/header/PrefixSeparatorIterator.hbs", packagePath() + File.separatorChar + "header", "PrefixSeparatorIterator.java")); + supportingFiles.add(new SupportingFile( + "src/test/java/packagename/header/SchemaHeaderTest.hbs", + testPackagePath() + File.separatorChar + "header", + "SchemaHeaderTest.java")); // parameter supportingFiles.add(new SupportingFile( diff --git a/src/main/resources/java/src/main/java/packagename/header/HeaderBase.hbs b/src/main/resources/java/src/main/java/packagename/header/HeaderBase.hbs index 60a3dc1ffe1..5cceec00321 100644 --- a/src/main/resources/java/src/main/java/packagename/header/HeaderBase.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/HeaderBase.hbs @@ -6,10 +6,10 @@ import {{{packageName}}}.parameter.ParameterStyle; public class HeaderBase { public final boolean required; public final @Nullable ParameterStyle style; - public final @Nullable boolean explode; - public final @Nullable boolean allowReserved; + public final @Nullable Boolean explode; + public final @Nullable Boolean allowReserved; - public HeaderBase(boolean required, @Nullable ParameterStyle style, @Nullable boolean explode, @Nullable boolean allowReserved) { + public HeaderBase(boolean required, @Nullable ParameterStyle style, @Nullable Boolean explode, @Nullable Boolean allowReserved) { this.required = required; this.style = style; this.explode = explode; diff --git a/src/main/resources/java/src/main/java/packagename/header/Rfc6570Serializer.hbs b/src/main/resources/java/src/main/java/packagename/header/Rfc6570Serializer.hbs index 182b5355ee1..f6e45696151 100644 --- a/src/main/resources/java/src/main/java/packagename/header/Rfc6570Serializer.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/Rfc6570Serializer.hbs @@ -6,7 +6,7 @@ import {{{packageName}}}.exceptions.InvalidTypeException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.AbstractMap; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -64,7 +64,7 @@ public class Rfc6570Serializer { } throw new InvalidTypeException("Unable to generate a rfc6570 item representation of "+item); } - + private static String rfc6570StrNumberExpansion( @Nullable Object inData, boolean percentEncode, @@ -120,7 +120,7 @@ public class Rfc6570Serializer { var inDataMap = inData.entrySet().stream() .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), rfc6570ItemValue(entry.getValue(), percentEncode))) .filter(entry -> entry.getValue() != null) - .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, HashMap::new)); + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new)); if (inDataMap.isEmpty()) { // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 diff --git a/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs b/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs index 92269547e5c..4040e017c1a 100644 --- a/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs @@ -13,8 +13,8 @@ import java.util.function.BiPredicate; public class SchemaHeader extends HeaderBase implements Header { public final JsonSchema schema; - public SchemaHeader(boolean required, @Nullable boolean allowReserved, JsonSchema schema) { - super(required, ParameterStyle.SIMPLE, false, allowReserved); + public SchemaHeader(boolean required, @Nullable Boolean allowReserved, @Nullable Boolean explode, JsonSchema schema) { + super(required, ParameterStyle.SIMPLE, explode, allowReserved); this.schema = schema; } @@ -27,7 +27,8 @@ public class SchemaHeader extends HeaderBase implements Header { @Override public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { var castInData = skipValidation ? inData : schema.validate(inData, configuration); - var value = StyleSimpleSerializer.serializeSimple(castInData, name, explode, false); + boolean usedExplode = explode != null && explode; + var value = StyleSimpleSerializer.serializeSimple(castInData, name, usedExplode, false); return toHeaders(name, value); } } \ No newline at end of file diff --git a/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs b/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs new file mode 100644 index 00000000000..78120d745db --- /dev/null +++ b/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs @@ -0,0 +1,108 @@ +package {{{packageName}}}.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.junit.Assert; +import org.junit.Test; +import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; +import {{{packageName}}}.configurations.SchemaConfiguration; +import {{{packageName}}}.exceptions.InvalidTypeException; +import {{{packageName}}}.schemas.AnyTypeJsonSchema; + +import java.net.http.HttpHeaders; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiPredicate; + +public class SchemaHeaderTest { + public record ParamTestCase(@Nullable Object payload, Map> expectedSerialization, @Nullable Boolean explode) { + public ParamTestCase(@Nullable Object payload, Map> expectedSerialization) { + this(payload, expectedSerialization, null); + } + } + + @Test + public void testSerialization() { + var mapPayload = new LinkedHashMap(); + mapPayload.put("R", 100); + mapPayload.put("G", 200); + mapPayload.put("B", 150); + var testCases = List.of( + new ParamTestCase( + null, + Map.of("color", List.of("")) + ), + new ParamTestCase( + 1, + Map.of("color", List.of("1")) + ), + new ParamTestCase( + 3.14, + Map.of("color",List.of("3.14")) + ), + new ParamTestCase( + "blue", + Map.of("color", List.of("blue")) + ), + new ParamTestCase( + "hello world", + Map.of("color", List.of("hello world")) + ), + new ParamTestCase( + "", + Map.of("color", List.of("")) + ), + new ParamTestCase( + List.of(), + Map.of("color", List.of("")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("blue,black,brown")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("blue,black,brown")), + true + ), + new ParamTestCase( + Map.of(), + Map.of("color", List.of("")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("R,100,G,200,B,150")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("R=100,G=200,B=150")), + true + ) + ); + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + BiPredicate headerFilter = (key, val) -> true; + for (ParamTestCase testCase: testCases) { + var header = new SchemaHeader( + true, + false, + testCase.explode, + AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance() + ); + var serialization = header.serialize(testCase.payload, "color", true, configuration); + Assert.assertEquals(HttpHeaders.of(testCase.expectedSerialization, headerFilter), serialization); + } + SchemaHeader boolHeader = new SchemaHeader( + true, + false, + false, + AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance() + ); + for (boolean value: Set.of(true, false)) { + Assert.assertThrows( + InvalidTypeException.class, + () -> boolHeader.serialize(value, "color", true, configuration) + ); + } + } +} From 38bfcf3e1d080b5bf5adaf224dcaa6880690a88e Mon Sep 17 00:00:00 2001 From: Justin Black Date: Wed, 28 Feb 2024 13:06:30 -0800 Subject: [PATCH 06/32] Adds content type detector and serializer, adds ContentHeader --- .../petstore/java/.openapi-generator/FILES | 3 ++ .../contenttype/ContentTypeDetector.java | 18 ++++++++ .../contenttype/ContentTypeSerializer.java | 18 ++++++++ .../client/header/ContentHeader.java | 43 +++++++++++++++++++ .../requestbody/RequestBodySerializer.java | 29 +++---------- .../client/response/ResponseDeserializer.java | 18 ++------ .../RequestBodySerializerTest.java | 13 +++--- .../generators/JavaClientGenerator.java | 13 ++++++ .../contenttype/ContentTypeDetector.hbs | 18 ++++++++ .../contenttype/ContentTypeSerializer.hbs | 18 ++++++++ .../java/packagename/header/ContentHeader.hbs | 43 +++++++++++++++++++ .../requestbody/RequestBodySerializer.hbs | 29 +++---------- .../response/ResponseDeserializer.hbs | 18 ++------ .../requestbody/RequestBodySerializerTest.hbs | 13 +++--- 14 files changed, 204 insertions(+), 90 deletions(-) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java create mode 100644 src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeDetector.hbs create mode 100644 src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeSerializer.hbs create mode 100644 src/main/resources/java/src/main/java/packagename/header/ContentHeader.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 86b0a49e8b8..165000917c0 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -505,12 +505,15 @@ src/main/java/org/openapijsonschematools/client/components/securityschemes/Petst src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java src/main/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/client/configurations/SchemaConfiguration.java +src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java +src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java src/main/java/org/openapijsonschematools/client/exceptions/ApiException.java src/main/java/org/openapijsonschematools/client/exceptions/BaseException.java src/main/java/org/openapijsonschematools/client/exceptions/InvalidAdditionalPropertyException.java src/main/java/org/openapijsonschematools/client/exceptions/InvalidTypeException.java src/main/java/org/openapijsonschematools/client/exceptions/UnsetPropertyException.java src/main/java/org/openapijsonschematools/client/exceptions/ValidationException.java +src/main/java/org/openapijsonschematools/client/header/ContentHeader.java src/main/java/org/openapijsonschematools/client/header/Header.java src/main/java/org/openapijsonschematools/client/header/HeaderBase.java src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java new file mode 100644 index 00000000000..6625c193f6a --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.contenttype; + +import java.util.regex.Pattern; + +public class ContentTypeDetector { + private static final Pattern jsonContentTypePattern = Pattern.compile( + "application/[^+]*[+]?(json);?.*" + ); + private static final String textPlainContentType = "text/plain"; + + public static boolean contentTypeIsJson(String contentType) { + return jsonContentTypePattern.matcher(contentType).find(); + } + + public static boolean contentTypeIsTextPlain(String contentType) { + return textPlainContentType.equals(contentType); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java new file mode 100644 index 00000000000..51bcdeeddaf --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.contenttype; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class ContentTypeSerializer { + private static final Gson gson = new GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .create(); + + @SuppressWarnings("nullness") + public static String toJson(@Nullable Object body) { + return gson.toJson(body); + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java new file mode 100644 index 00000000000..c2c227f6835 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java @@ -0,0 +1,43 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; +import org.openapijsonschematools.client.contenttype.ContentTypeSerializer; +import org.openapijsonschematools.client.mediatype.MediaType; +import org.openapijsonschematools.client.parameter.ParameterStyle; + +import java.net.http.HttpHeaders; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class ContentHeader extends HeaderBase implements Header { + public final Map> content; + + public ContentHeader(boolean required, @Nullable Boolean allowReserved, @Nullable Boolean explode, Map> content) { + super(required, ParameterStyle.SIMPLE, explode, allowReserved); + this.content = content; + } + + private static HttpHeaders toHeaders(String name, String value) { + Map> map = Map.of(name, List.of(value)); + BiPredicate headerFilter = (key, val) -> true; + return HttpHeaders.of(map, headerFilter); + } + + @Override + public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { + for (Map.Entry> entry: content.entrySet()) { + var castInData = skipValidation ? inData : entry.getValue().schema().validate(inData, configuration); + String contentType = entry.getKey(); + if (ContentTypeDetector.contentTypeIsJson(contentType)) { + var value = ContentTypeSerializer.toJson(castInData); + return toHeaders(name, value); + } else { + throw new RuntimeException("Serialization of "+contentType+" has not yet been implemented"); + } + } + throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair"); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java index e221acb164a..37fb90cd4f2 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java @@ -2,13 +2,11 @@ import java.net.http.HttpRequest; import org.checkerframework.checker.nullness.qual.Nullable; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.ToNumberPolicy; import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; +import org.openapijsonschematools.client.contenttype.ContentTypeSerializer; import java.util.Map; -import java.util.regex.Pattern; public abstract class RequestBodySerializer { /* @@ -17,31 +15,14 @@ public abstract class RequestBodySerializer { */ public final Map content; public final boolean required; - private static final Pattern jsonContentTypePattern = Pattern.compile( - "application/[^+]*[+]?(json);?.*" - ); - private static final Gson gson = new GsonBuilder() - .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) - .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) - .create(); - private static final String textPlainContentType = "text/plain"; public RequestBodySerializer(Map content, boolean required) { this.content = content; this.required = required; } - protected static boolean contentTypeIsJson(String contentType) { - return jsonContentTypePattern.matcher(contentType).find(); - } - - @SuppressWarnings("nullness") - private String toJson(@Nullable Object body) { - return gson.toJson(body); - } - private SerializedRequestBody serializeJson(String contentType, @Nullable Object body) { - String jsonText = toJson(body); + String jsonText = ContentTypeSerializer.toJson(body); return new SerializedRequestBody(contentType, HttpRequest.BodyPublishers.ofString(jsonText)); } @@ -53,9 +34,9 @@ private SerializedRequestBody serializeTextPlain(String contentType, @Nullable O } protected SerializedRequestBody serialize(String contentType, @Nullable Object body) { - if (contentTypeIsJson(contentType)) { + if (ContentTypeDetector.contentTypeIsJson(contentType)) { return serializeJson(contentType, body); - } else if (contentType.equals(textPlainContentType)) { + } else if (ContentTypeDetector.contentTypeIsTextPlain(contentType)) { return serializeTextPlain(contentType, body); } throw new RuntimeException("Serialization has not yet been implemented for contentType="+contentType+". If you need it please file a PR"); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java index 5bc67aaf446..f99b02ab832 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java @@ -5,7 +5,6 @@ import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Optional; -import java.util.regex.Pattern; import org.checkerframework.checker.nullness.qual.Nullable; import com.google.gson.Gson; @@ -14,18 +13,15 @@ import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; public abstract class ResponseDeserializer { public final Map content; public final @Nullable Map headers; // todo change the value to header - private static final Pattern jsonContentTypePattern = Pattern.compile( - "application/[^+]*[+]?(json);?.*" - ); private static final Gson gson = new GsonBuilder() .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .create(); - protected static final String textPlainContentType = "text/plain"; public ResponseDeserializer(Map content) { this.content = content; @@ -44,19 +40,11 @@ protected String deserializeTextPlain(byte[] body) { return new String(body, StandardCharsets.UTF_8); } - protected static boolean contentTypeIsJson(String contentType) { - return jsonContentTypePattern.matcher(contentType).find(); - } - - protected static boolean contentTypeIsTextPlain(String contentType) { - return textPlainContentType.equals(contentType); - } - protected T deserializeBody(String contentType, byte[] body, JsonSchema schema, SchemaConfiguration configuration) { - if (contentTypeIsJson(contentType)) { + if (ContentTypeDetector.contentTypeIsJson(contentType)) { @Nullable Object bodyData = deserializeJson(body); return schema.validateAndBox(bodyData, configuration); - } else if (contentTypeIsTextPlain(contentType)) { + } else if (ContentTypeDetector.contentTypeIsTextPlain(contentType)) { String bodyData = deserializeTextPlain(body); return schema.validateAndBox(bodyData, configuration); } diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java index 250d1e0f530..9f0c86ec5c4 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java @@ -2,6 +2,7 @@ import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; import org.openapijsonschematools.client.schemas.StringJsonSchema; @@ -58,13 +59,13 @@ public SerializedRequestBody serialize(SealedRequestBody requestBody) { @Test public void testContentTypeIsJson() { - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json; charset=UTF-8")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json-patch+json")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/geo+json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json; charset=UTF-8")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json-patch+json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/geo+json")); - Assert.assertFalse(RequestBodySerializer.contentTypeIsJson("application/octet-stream")); - Assert.assertFalse(RequestBodySerializer.contentTypeIsJson("text/plain")); + Assert.assertFalse(ContentTypeDetector.contentTypeIsJson("application/octet-stream")); + Assert.assertFalse(ContentTypeDetector.contentTypeIsJson("text/plain")); } static final class StringSubscriber implements Flow.Subscriber { diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 3e44d87c38c..17b866f95e3 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -768,6 +768,15 @@ public void processOpts() { "src/main/java/packagename/mediatype/Encoding.hbs", packagePath() + File.separatorChar + "mediatype", "Encoding.java")); + // contenttype + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/contenttype/ContentTypeDetector.hbs", + packagePath() + File.separatorChar + "contenttype", + "ContentTypeDetector.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/contenttype/ContentTypeSerializer.hbs", + packagePath() + File.separatorChar + "contenttype", + "ContentTypeSerializer.java")); // header supportingFiles.add(new SupportingFile( "src/main/java/packagename/header/Header.hbs", @@ -781,6 +790,10 @@ public void processOpts() { "src/main/java/packagename/header/SchemaHeader.hbs", packagePath() + File.separatorChar + "header", "SchemaHeader.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/header/ContentHeader.hbs", + packagePath() + File.separatorChar + "header", + "ContentHeader.java")); supportingFiles.add(new SupportingFile( "src/main/java/packagename/header/StyleSimpleSerializer.hbs", packagePath() + File.separatorChar + "header", diff --git a/src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeDetector.hbs b/src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeDetector.hbs new file mode 100644 index 00000000000..a3ff25132bd --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeDetector.hbs @@ -0,0 +1,18 @@ +package {{{packageName}}}.contenttype; + +import java.util.regex.Pattern; + +public class ContentTypeDetector { + private static final Pattern jsonContentTypePattern = Pattern.compile( + "application/[^+]*[+]?(json);?.*" + ); + private static final String textPlainContentType = "text/plain"; + + public static boolean contentTypeIsJson(String contentType) { + return jsonContentTypePattern.matcher(contentType).find(); + } + + public static boolean contentTypeIsTextPlain(String contentType) { + return textPlainContentType.equals(contentType); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeSerializer.hbs b/src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeSerializer.hbs new file mode 100644 index 00000000000..0302192e32e --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeSerializer.hbs @@ -0,0 +1,18 @@ +package {{{packageName}}}.contenttype; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class ContentTypeSerializer { + private static final Gson gson = new GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .create(); + + @SuppressWarnings("nullness") + public static String toJson(@Nullable Object body) { + return gson.toJson(body); + } +} diff --git a/src/main/resources/java/src/main/java/packagename/header/ContentHeader.hbs b/src/main/resources/java/src/main/java/packagename/header/ContentHeader.hbs new file mode 100644 index 00000000000..30ca40c5a24 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/header/ContentHeader.hbs @@ -0,0 +1,43 @@ +package {{{packageName}}}.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.configurations.SchemaConfiguration; +import {{{packageName}}}.contenttype.ContentTypeDetector; +import {{{packageName}}}.contenttype.ContentTypeSerializer; +import {{{packageName}}}.mediatype.MediaType; +import {{{packageName}}}.parameter.ParameterStyle; + +import java.net.http.HttpHeaders; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class ContentHeader extends HeaderBase implements Header { + public final Map> content; + + public ContentHeader(boolean required, @Nullable Boolean allowReserved, @Nullable Boolean explode, Map> content) { + super(required, ParameterStyle.SIMPLE, explode, allowReserved); + this.content = content; + } + + private static HttpHeaders toHeaders(String name, String value) { + Map> map = Map.of(name, List.of(value)); + BiPredicate headerFilter = (key, val) -> true; + return HttpHeaders.of(map, headerFilter); + } + + @Override + public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { + for (Map.Entry> entry: content.entrySet()) { + var castInData = skipValidation ? inData : entry.getValue().schema().validate(inData, configuration); + String contentType = entry.getKey(); + if (ContentTypeDetector.contentTypeIsJson(contentType)) { + var value = ContentTypeSerializer.toJson(castInData); + return toHeaders(name, value); + } else { + throw new RuntimeException("Serialization of "+contentType+" has not yet been implemented"); + } + } + throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair"); + } +} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/requestbody/RequestBodySerializer.hbs b/src/main/resources/java/src/main/java/packagename/requestbody/RequestBodySerializer.hbs index 32947686693..312b163fe2c 100644 --- a/src/main/resources/java/src/main/java/packagename/requestbody/RequestBodySerializer.hbs +++ b/src/main/resources/java/src/main/java/packagename/requestbody/RequestBodySerializer.hbs @@ -2,13 +2,11 @@ package {{{packageName}}}.requestbody; import java.net.http.HttpRequest; import org.checkerframework.checker.nullness.qual.Nullable; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.ToNumberPolicy; import {{{packageName}}}.schemas.validation.JsonSchema; +import {{{packageName}}}.contenttype.ContentTypeDetector; +import {{{packageName}}}.contenttype.ContentTypeSerializer; import java.util.Map; -import java.util.regex.Pattern; public abstract class RequestBodySerializer { /* @@ -17,31 +15,14 @@ public abstract class RequestBodySerializer { */ public final Map content; public final boolean required; - private static final Pattern jsonContentTypePattern = Pattern.compile( - "application/[^+]*[+]?(json);?.*" - ); - private static final Gson gson = new GsonBuilder() - .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) - .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) - .create(); - private static final String textPlainContentType = "text/plain"; public RequestBodySerializer(Map content, boolean required) { this.content = content; this.required = required; } - protected static boolean contentTypeIsJson(String contentType) { - return jsonContentTypePattern.matcher(contentType).find(); - } - - @SuppressWarnings("nullness") - private String toJson(@Nullable Object body) { - return gson.toJson(body); - } - private SerializedRequestBody serializeJson(String contentType, @Nullable Object body) { - String jsonText = toJson(body); + String jsonText = ContentTypeSerializer.toJson(body); return new SerializedRequestBody(contentType, HttpRequest.BodyPublishers.ofString(jsonText)); } @@ -53,9 +34,9 @@ public abstract class RequestBodySerializer { } protected SerializedRequestBody serialize(String contentType, @Nullable Object body) { - if (contentTypeIsJson(contentType)) { + if (ContentTypeDetector.contentTypeIsJson(contentType)) { return serializeJson(contentType, body); - } else if (contentType.equals(textPlainContentType)) { + } else if (ContentTypeDetector.contentTypeIsTextPlain(contentType)) { return serializeTextPlain(contentType, body); } throw new RuntimeException("Serialization has not yet been implemented for contentType="+contentType+". If you need it please file a PR"); diff --git a/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs index 1373ade2a7c..b88aef90d9e 100644 --- a/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs +++ b/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs @@ -5,7 +5,6 @@ import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Optional; -import java.util.regex.Pattern; import org.checkerframework.checker.nullness.qual.Nullable; import com.google.gson.Gson; @@ -14,18 +13,15 @@ import com.google.gson.ToNumberPolicy; import {{{packageName}}}.configurations.SchemaConfiguration; import {{{packageName}}}.schemas.validation.JsonSchema; +import {{{packageName}}}.contenttype.ContentTypeDetector; public abstract class ResponseDeserializer { public final Map content; public final @Nullable Map headers; // todo change the value to header - private static final Pattern jsonContentTypePattern = Pattern.compile( - "application/[^+]*[+]?(json);?.*" - ); private static final Gson gson = new GsonBuilder() .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .create(); - protected static final String textPlainContentType = "text/plain"; public ResponseDeserializer(Map content) { this.content = content; @@ -44,19 +40,11 @@ public abstract class ResponseDeserializer T deserializeBody(String contentType, byte[] body, JsonSchema schema, SchemaConfiguration configuration) { - if (contentTypeIsJson(contentType)) { + if (ContentTypeDetector.contentTypeIsJson(contentType)) { @Nullable Object bodyData = deserializeJson(body); return schema.validateAndBox(bodyData, configuration); - } else if (contentTypeIsTextPlain(contentType)) { + } else if (ContentTypeDetector.contentTypeIsTextPlain(contentType)) { String bodyData = deserializeTextPlain(body); return schema.validateAndBox(bodyData, configuration); } diff --git a/src/main/resources/java/src/test/java/packagename/requestbody/RequestBodySerializerTest.hbs b/src/main/resources/java/src/test/java/packagename/requestbody/RequestBodySerializerTest.hbs index 0355eaf142e..f4c7425e4ad 100644 --- a/src/main/resources/java/src/test/java/packagename/requestbody/RequestBodySerializerTest.hbs +++ b/src/main/resources/java/src/test/java/packagename/requestbody/RequestBodySerializerTest.hbs @@ -2,6 +2,7 @@ package {{{packageName}}}.requestbody; import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; import {{{packageName}}}.configurations.SchemaConfiguration; +import {{{packageName}}}.contenttype.ContentTypeDetector; import {{{packageName}}}.schemas.AnyTypeJsonSchema; import {{{packageName}}}.schemas.StringJsonSchema; @@ -58,13 +59,13 @@ public final class RequestBodySerializerTest { @Test public void testContentTypeIsJson() { - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json; charset=UTF-8")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json-patch+json")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/geo+json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json; charset=UTF-8")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json-patch+json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/geo+json")); - Assert.assertFalse(RequestBodySerializer.contentTypeIsJson("application/octet-stream")); - Assert.assertFalse(RequestBodySerializer.contentTypeIsJson("text/plain")); + Assert.assertFalse(ContentTypeDetector.contentTypeIsJson("application/octet-stream")); + Assert.assertFalse(ContentTypeDetector.contentTypeIsJson("text/plain")); } static final class StringSubscriber implements Flow.Subscriber { From 187303cda1b1880695e761b3faf1bc8451eb4d1d Mon Sep 17 00:00:00 2001 From: Justin Black Date: Wed, 28 Feb 2024 13:38:21 -0800 Subject: [PATCH 07/32] Adds ContentHeader and test --- .../petstore/java/.openapi-generator/FILES | 2 +- .../client/parameter/ParameterBase.java | 27 ---- .../client/header/ContentHeaderTest.java | 117 ++++++++++++++++++ .../generators/JavaClientGenerator.java | 8 +- .../packagename/parameter/ParameterBase.hbs | 27 ---- .../packagename/header/ContentHeaderTest.hbs | 117 ++++++++++++++++++ 6 files changed, 239 insertions(+), 59 deletions(-) delete mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterBase.java create mode 100644 samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java delete mode 100644 src/main/resources/java/src/main/java/packagename/parameter/ParameterBase.hbs create mode 100644 src/main/resources/java/src/test/java/packagename/header/ContentHeaderTest.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 165000917c0..50f880ac805 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -522,7 +522,6 @@ src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java src/main/java/org/openapijsonschematools/client/mediatype/MediaType.java -src/main/java/org/openapijsonschematools/client/parameter/ParameterBase.java src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java src/main/java/org/openapijsonschematools/client/parameter/ParameterStyle.java src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/RequestBody.java @@ -1077,6 +1076,7 @@ src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.j src/main/java/org/openapijsonschematools/client/servers/server0/Variables.java src/main/java/org/openapijsonschematools/client/servers/server1/Variables.java src/test/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlagsTest.java +src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterBase.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterBase.java deleted file mode 100644 index 5d6b0ee9806..00000000000 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterBase.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.openapijsonschematools.client.parameter; - -import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.mediatype.MediaType; -import org.openapijsonschematools.client.schemas.validation.JsonSchema; - -import java.util.Map; - -public class ParameterBase { - public final ParameterInType inType; - public final boolean required; - public final @Nullable ParameterStyle style; - public final @Nullable boolean explode; - public final @Nullable boolean allowReserved; - public final @Nullable JsonSchema schema; - public final @Nullable Map> content; - - public ParameterBase(ParameterInType inType, boolean required, @Nullable ParameterStyle style, @Nullable boolean explode, @Nullable boolean allowReserved, JsonSchema schema, @Nullable Map> content) { - this.inType = inType; - this.required = required; - this.style = style; - this.explode = explode; - this.allowReserved = allowReserved; - this.schema = schema; - this.content = content; - } -} \ No newline at end of file diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java new file mode 100644 index 00000000000..82912ecdced --- /dev/null +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java @@ -0,0 +1,117 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.mediatype.MediaType; +import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; + +import java.net.http.HttpHeaders; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class ContentHeaderTest { + public record ParamTestCase(@Nullable Object payload, Map> expectedSerialization, @Nullable Boolean explode) { + public ParamTestCase(@Nullable Object payload, Map> expectedSerialization) { + this(payload, expectedSerialization, null); + } + } + + @Test + public void testSerialization() { + var mapPayload = new LinkedHashMap(); + mapPayload.put("R", 100); + mapPayload.put("G", 200); + mapPayload.put("B", 150); + var testCases = List.of( + new ParamTestCase( + null, + Map.of("color", List.of("null")) + ), + new ParamTestCase( + true, + Map.of("color", List.of("true")) + ), + new ParamTestCase( + false, + Map.of("color", List.of("false")) + ), + new ParamTestCase( + 1, + Map.of("color", List.of("1")) + ), + new ParamTestCase( + 3.14, + Map.of("color",List.of("3.14")) + ), + new ParamTestCase( + "blue", + Map.of("color", List.of("\"blue\"")) + ), + new ParamTestCase( + "hello world", + Map.of("color", List.of("\"hello world\"")) + ), + new ParamTestCase( + "", + Map.of("color", List.of("\"\"")) + ), + new ParamTestCase( + List.of(), + Map.of("color", List.of("[]")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("[\"blue\",\"black\",\"brown\"]")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("[\"blue\",\"black\",\"brown\"]")), + true + ), + new ParamTestCase( + Map.of(), + Map.of("color", List.of("{}")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("{\"R\":100,\"G\":200,\"B\":150}")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("{\"R\":100,\"G\":200,\"B\":150}")), + true + ) + ); + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + BiPredicate headerFilter = (key, val) -> true; + class ApplicationJsonMediaType implements MediaType { + @Override + public AnyTypeJsonSchema.AnyTypeJsonSchema1 schema() { + return AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance(); + } + + @Override + public Void encoding() { + return null; + } + } + Map> content = Map.of( + "application/json", new ApplicationJsonMediaType() + ); + for (ParamTestCase testCase: testCases) { + var header = new ContentHeader( + true, + false, + testCase.explode, + content + ); + var serialization = header.serialize(testCase.payload, "color", true, configuration); + Assert.assertEquals(HttpHeaders.of(testCase.expectedSerialization, headerFilter), serialization); + } + } +} diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 17b866f95e3..cc19e7d3ece 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -810,6 +810,10 @@ public void processOpts() { "src/test/java/packagename/header/SchemaHeaderTest.hbs", testPackagePath() + File.separatorChar + "header", "SchemaHeaderTest.java")); + supportingFiles.add(new SupportingFile( + "src/test/java/packagename/header/ContentHeaderTest.hbs", + testPackagePath() + File.separatorChar + "header", + "ContentHeaderTest.java")); // parameter supportingFiles.add(new SupportingFile( @@ -820,10 +824,6 @@ public void processOpts() { "src/main/java/packagename/parameter/ParameterInType.hbs", packagePath() + File.separatorChar + "parameter", "ParameterInType.java")); - supportingFiles.add(new SupportingFile( - "src/main/java/packagename/parameter/ParameterBase.hbs", - packagePath() + File.separatorChar + "parameter", - "ParameterBase.java")); // response supportingFiles.add(new SupportingFile( diff --git a/src/main/resources/java/src/main/java/packagename/parameter/ParameterBase.hbs b/src/main/resources/java/src/main/java/packagename/parameter/ParameterBase.hbs deleted file mode 100644 index 337f7e0ed9c..00000000000 --- a/src/main/resources/java/src/main/java/packagename/parameter/ParameterBase.hbs +++ /dev/null @@ -1,27 +0,0 @@ -package {{{packageName}}}.parameter; - -import org.checkerframework.checker.nullness.qual.Nullable; -import {{{packageName}}}.mediatype.MediaType; -import {{{packageName}}}.schemas.validation.JsonSchema; - -import java.util.Map; - -public class ParameterBase { - public final ParameterInType inType; - public final boolean required; - public final @Nullable ParameterStyle style; - public final @Nullable boolean explode; - public final @Nullable boolean allowReserved; - public final @Nullable JsonSchema schema; - public final @Nullable Map> content; - - public ParameterBase(ParameterInType inType, boolean required, @Nullable ParameterStyle style, @Nullable boolean explode, @Nullable boolean allowReserved, JsonSchema schema, @Nullable Map> content) { - this.inType = inType; - this.required = required; - this.style = style; - this.explode = explode; - this.allowReserved = allowReserved; - this.schema = schema; - this.content = content; - } -} \ No newline at end of file diff --git a/src/main/resources/java/src/test/java/packagename/header/ContentHeaderTest.hbs b/src/main/resources/java/src/test/java/packagename/header/ContentHeaderTest.hbs new file mode 100644 index 00000000000..c0ad2f24988 --- /dev/null +++ b/src/main/resources/java/src/test/java/packagename/header/ContentHeaderTest.hbs @@ -0,0 +1,117 @@ +package {{{packageName}}}.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.junit.Assert; +import org.junit.Test; +import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; +import {{{packageName}}}.configurations.SchemaConfiguration; +import {{{packageName}}}.mediatype.MediaType; +import {{{packageName}}}.schemas.AnyTypeJsonSchema; + +import java.net.http.HttpHeaders; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class ContentHeaderTest { + public record ParamTestCase(@Nullable Object payload, Map> expectedSerialization, @Nullable Boolean explode) { + public ParamTestCase(@Nullable Object payload, Map> expectedSerialization) { + this(payload, expectedSerialization, null); + } + } + + @Test + public void testSerialization() { + var mapPayload = new LinkedHashMap(); + mapPayload.put("R", 100); + mapPayload.put("G", 200); + mapPayload.put("B", 150); + var testCases = List.of( + new ParamTestCase( + null, + Map.of("color", List.of("null")) + ), + new ParamTestCase( + true, + Map.of("color", List.of("true")) + ), + new ParamTestCase( + false, + Map.of("color", List.of("false")) + ), + new ParamTestCase( + 1, + Map.of("color", List.of("1")) + ), + new ParamTestCase( + 3.14, + Map.of("color",List.of("3.14")) + ), + new ParamTestCase( + "blue", + Map.of("color", List.of("\"blue\"")) + ), + new ParamTestCase( + "hello world", + Map.of("color", List.of("\"hello world\"")) + ), + new ParamTestCase( + "", + Map.of("color", List.of("\"\"")) + ), + new ParamTestCase( + List.of(), + Map.of("color", List.of("[]")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("[\"blue\",\"black\",\"brown\"]")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("[\"blue\",\"black\",\"brown\"]")), + true + ), + new ParamTestCase( + Map.of(), + Map.of("color", List.of("{}")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("{\"R\":100,\"G\":200,\"B\":150}")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("{\"R\":100,\"G\":200,\"B\":150}")), + true + ) + ); + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + BiPredicate headerFilter = (key, val) -> true; + class ApplicationJsonMediaType implements MediaType { + @Override + public AnyTypeJsonSchema.AnyTypeJsonSchema1 schema() { + return AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance(); + } + + @Override + public Void encoding() { + return null; + } + } + Map> content = Map.of( + "application/json", new ApplicationJsonMediaType() + ); + for (ParamTestCase testCase: testCases) { + var header = new ContentHeader( + true, + false, + testCase.explode, + content + ); + var serialization = header.serialize(testCase.payload, "color", true, configuration); + Assert.assertEquals(HttpHeaders.of(testCase.expectedSerialization, headerFilter), serialization); + } + } +} From 8365bb4641518f7004ec575a2be41bdc5cf3f037 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Wed, 28 Feb 2024 14:50:30 -0800 Subject: [PATCH 08/32] Generates headers for responses --- .../petstore/java/.openapi-generator/FILES | 18 +++++ .../headers/Int32JsonContentTypeHeader.java | 34 ++++++++++ .../components/headers/NumberHeader.java | 18 +++++ .../headers/RefContentSchemaHeader.java | 34 ++++++++++ .../components/headers/RefSchemaHeader.java | 18 +++++ .../components/headers/RefStringHeader.java | 6 ++ .../components/headers/StringHeader.java | 18 +++++ .../responses/headerswithnobody/Headers.java | 2 +- .../headerswithnobody/headers/Location.java | 18 +++++ .../Headers.java | 2 +- .../headers/SomeHeader.java | 18 +++++ .../successwithjsonapiresponse/Headers.java | 4 +- .../headers/Int32.java | 7 ++ .../headers/NumberHeader.java | 7 ++ .../headers/Refcontentschemaheader.java | 7 ++ .../headers/Refschemaheader.java | 7 ++ .../headers/StringHeader.java | 7 ++ .../responses/code200response/Headers.java | 4 +- .../code200response/headers/Int32.java | 7 ++ .../code200response/headers/NumberHeader.java | 7 ++ .../headers/Refcontentschemaheader.java | 7 ++ .../headers/XExpiresAfter.java | 18 +++++ .../code200response/headers/XRateLimit.java | 34 ++++++++++ .../codegen/generators/DefaultGenerator.java | 9 +-- .../generators/JavaClientGenerator.java | 34 +++++++++- .../openapimodels/CodegenHeader.java | 4 +- .../packagename/components/headers/Header.hbs | 67 +++++++++++++++++++ 27 files changed, 404 insertions(+), 12 deletions(-) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/Int32JsonContentTypeHeader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/NumberHeader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefContentSchemaHeader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefSchemaHeader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefStringHeader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/StringHeader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/Location.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/SomeHeader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Int32.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refcontentschemaheader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refschemaheader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/StringHeader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Int32.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Refcontentschemaheader.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/XExpiresAfter.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/XRateLimit.java create mode 100644 src/main/resources/java/src/main/java/packagename/components/headers/Header.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 50f880ac805..4d60d895970 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -324,6 +324,12 @@ docs/servers/Server1.md docs/servers/Server2.md pom.xml src/main/java/org/openapijsonschematools/client/RootServerInfo.java +src/main/java/org/openapijsonschematools/client/components/headers/Int32JsonContentTypeHeader.java +src/main/java/org/openapijsonschematools/client/components/headers/NumberHeader.java +src/main/java/org/openapijsonschematools/client/components/headers/RefContentSchemaHeader.java +src/main/java/org/openapijsonschematools/client/components/headers/RefSchemaHeader.java +src/main/java/org/openapijsonschematools/client/components/headers/RefStringHeader.java +src/main/java/org/openapijsonschematools/client/components/headers/StringHeader.java src/main/java/org/openapijsonschematools/client/components/headers/int32jsoncontenttypeheader/content/applicationjson/Int32JsonContentTypeHeaderSchema.java src/main/java/org/openapijsonschematools/client/components/headers/numberheader/NumberHeaderSchema.java src/main/java/org/openapijsonschematools/client/components/headers/refcontentschemaheader/content/applicationjson/RefContentSchemaHeaderSchema.java @@ -348,14 +354,21 @@ src/main/java/org/openapijsonschematools/client/components/responses/SuccessInli src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java src/main/java/org/openapijsonschematools/client/components/responses/SuccessfulXmlAndJsonArrayOfPet.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java +src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/Location.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/location/LocationSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successfulxmlandjsonarrayofpet/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successfulxmlandjsonarrayofpet/content/applicationxml/ApplicationxmlSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/content/applicationjson/ApplicationjsonSchema.java +src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/SomeHeader.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/someheader/SomeHeaderSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/content/applicationjson/ApplicationjsonSchema.java +src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Int32.java +src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java +src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refcontentschemaheader.java +src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refschemaheader.java +src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/StringHeader.java src/main/java/org/openapijsonschematools/client/components/schemas/AbstractStepMessage.java src/main/java/org/openapijsonschematools/client/components/schemas/AdditionalPropertiesClass.java src/main/java/org/openapijsonschematools/client/components/schemas/AdditionalPropertiesSchema.java @@ -929,6 +942,11 @@ src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Co src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/content/applicationxml/ApplicationxmlSchema.java +src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Int32.java +src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java +src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Refcontentschemaheader.java +src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/XExpiresAfter.java +src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/XRateLimit.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/xexpiresafter/XExpiresAfterSchema.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/xratelimit/content/applicationjson/XRateLimitSchema.java src/main/java/org/openapijsonschematools/client/paths/userlogout/get/Responses.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/Int32JsonContentTypeHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/Int32JsonContentTypeHeader.java new file mode 100644 index 00000000000..5d91b356758 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/Int32JsonContentTypeHeader.java @@ -0,0 +1,34 @@ +package org.openapijsonschematools.client.components.headers; + +import org.openapijsonschematools.client.header.ContentHeader; +import org.openapijsonschematools.client.mediatype.MediaType; +import org.openapijsonschematools.client.components.headers.int32jsoncontenttypeheader.content.applicationjson.Int32JsonContentTypeHeaderSchema; + +import java.util.AbstractMap; +import java.util.Map; + +public class Int32JsonContentTypeHeader { + + public record ApplicationjsonMediaType(Int32JsonContentTypeHeaderSchema.Int32JsonContentTypeHeaderSchema1 schema) implements MediaType { + public ApplicationjsonMediaType() { + this(Int32JsonContentTypeHeaderSchema.Int32JsonContentTypeHeaderSchema1.getInstance()); + } + @Override + public Void encoding() { + return null; + } + } + + public static class Int32JsonContentTypeHeader1 extends ContentHeader { + public Int32JsonContentTypeHeader1() { + super( + true, + null, + false, + Map.ofEntries( + new AbstractMap.SimpleEntry<>("application/json", new ApplicationjsonMediaType()) + ) + ); + } + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/NumberHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/NumberHeader.java new file mode 100644 index 00000000000..703f95cd089 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/NumberHeader.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.components.headers; + +import org.openapijsonschematools.client.header.SchemaHeader; +import org.openapijsonschematools.client.components.headers.numberheader.NumberHeaderSchema; + +public class NumberHeader { + + public static class NumberHeader1 extends SchemaHeader { + public NumberHeader1() { + super( + false, + null, + false, + NumberHeaderSchema.NumberHeaderSchema1.getInstance() + ); + } + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefContentSchemaHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefContentSchemaHeader.java new file mode 100644 index 00000000000..14fb0ea2ef2 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefContentSchemaHeader.java @@ -0,0 +1,34 @@ +package org.openapijsonschematools.client.components.headers; + +import org.openapijsonschematools.client.header.ContentHeader; +import org.openapijsonschematools.client.mediatype.MediaType; +import org.openapijsonschematools.client.components.headers.refcontentschemaheader.content.applicationjson.RefContentSchemaHeaderSchema; + +import java.util.AbstractMap; +import java.util.Map; + +public class RefContentSchemaHeader { + + public record ApplicationjsonMediaType(RefContentSchemaHeaderSchema.RefContentSchemaHeaderSchema1 schema) implements MediaType { + public ApplicationjsonMediaType() { + this(RefContentSchemaHeaderSchema.RefContentSchemaHeaderSchema1.getInstance()); + } + @Override + public Void encoding() { + return null; + } + } + + public static class RefContentSchemaHeader1 extends ContentHeader { + public RefContentSchemaHeader1() { + super( + true, + null, + false, + Map.ofEntries( + new AbstractMap.SimpleEntry<>("application/json", new ApplicationjsonMediaType()) + ) + ); + } + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefSchemaHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefSchemaHeader.java new file mode 100644 index 00000000000..21487d79b1f --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefSchemaHeader.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.components.headers; + +import org.openapijsonschematools.client.header.SchemaHeader; +import org.openapijsonschematools.client.components.headers.refschemaheader.RefSchemaHeaderSchema; + +public class RefSchemaHeader { + + public static class RefSchemaHeader1 extends SchemaHeader { + public RefSchemaHeader1() { + super( + true, + null, + false, + RefSchemaHeaderSchema.RefSchemaHeaderSchema1.getInstance() + ); + } + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefStringHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefStringHeader.java new file mode 100644 index 00000000000..ef2dde6549f --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/RefStringHeader.java @@ -0,0 +1,6 @@ +package org.openapijsonschematools.client.components.headers; + + +public class RefStringHeader extends StringHeader { + public static class RefStringHeader1 extends StringHeader1 {} +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/StringHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/StringHeader.java new file mode 100644 index 00000000000..ce2701d1c66 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/headers/StringHeader.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.components.headers; + +import org.openapijsonschematools.client.header.SchemaHeader; +import org.openapijsonschematools.client.components.headers.stringheader.StringHeaderSchema; + +public class StringHeader { + + public static class StringHeader1 extends SchemaHeader { + public StringHeader1() { + super( + true, + null, + false, + StringHeaderSchema.StringHeaderSchema1.getInstance() + ); + } + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java index 5a4894c3c3a..16394d94ae0 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java @@ -8,7 +8,7 @@ import java.util.Objects; import java.util.Set; import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.components.responses.headerswithnobody.headers.location.LocationSchema; +import org.openapijsonschematools.client.components.responses.headerswithnobody.headers.Location.LocationSchema; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.exceptions.InvalidTypeException; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/Location.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/Location.java new file mode 100644 index 00000000000..9f172e1f922 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/Location.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.components.responses.headerswithnobody.headers; + +import org.openapijsonschematools.client.header.SchemaHeader; +import org.openapijsonschematools.client.components.responses.headerswithnobody.headers.location.LocationSchema; + +public class Location { + + public static class Location1 extends SchemaHeader { + public Location1() { + super( + false, + null, + false, + LocationSchema.LocationSchema1.getInstance() + ); + } + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java index 209447c856e..fa97cbd4c0b 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java @@ -8,7 +8,7 @@ import java.util.Objects; import java.util.Set; import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.headers.someheader.SomeHeaderSchema; +import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.headers.SomeHeader.SomeHeaderSchema; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.exceptions.InvalidTypeException; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/SomeHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/SomeHeader.java new file mode 100644 index 00000000000..f0146d6c5d6 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/SomeHeader.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.components.responses.successinlinecontentandheader.headers; + +import org.openapijsonschematools.client.header.SchemaHeader; +import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.headers.someheader.SomeHeaderSchema; + +public class SomeHeader { + + public static class SomeHeader1 extends SchemaHeader { + public SomeHeader1() { + super( + false, + null, + false, + SomeHeaderSchema.SomeHeaderSchema1.getInstance() + ); + } + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java index 4e0a0752df7..66ae9543420 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java @@ -8,9 +8,9 @@ import java.util.Objects; import java.util.Set; import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.components.headers.NumberHeader.NumberHeaderSchema; +import org.openapijsonschematools.client.components.headers.StringHeader.StringHeaderSchema; import org.openapijsonschematools.client.components.headers.int32jsoncontenttypeheader.content.applicationjson.Int32JsonContentTypeHeaderSchema; -import org.openapijsonschematools.client.components.headers.numberheader.NumberHeaderSchema; -import org.openapijsonschematools.client.components.headers.stringheader.StringHeaderSchema; import org.openapijsonschematools.client.components.schemas.StringWithValidation; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Int32.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Int32.java new file mode 100644 index 00000000000..335c486ac51 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Int32.java @@ -0,0 +1,7 @@ +package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers; + +import org.openapijsonschematools.client.components.headers.Int32JsonContentTypeHeader; + +public class Int32 extends Int32JsonContentTypeHeader { + public static class Int321 extends Int32JsonContentTypeHeader1 {} +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java new file mode 100644 index 00000000000..2bb4df8e423 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java @@ -0,0 +1,7 @@ +package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers; + +import org.openapijsonschematools.client.components.headers.NumberHeader; + +public class NumberHeader extends NumberHeader { + public static class NumberHeader1 extends NumberHeader1 {} +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refcontentschemaheader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refcontentschemaheader.java new file mode 100644 index 00000000000..4f5df9abe04 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refcontentschemaheader.java @@ -0,0 +1,7 @@ +package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers; + +import org.openapijsonschematools.client.components.headers.RefContentSchemaHeader; + +public class Refcontentschemaheader extends RefContentSchemaHeader { + public static class Refcontentschemaheader1 extends RefContentSchemaHeader1 {} +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refschemaheader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refschemaheader.java new file mode 100644 index 00000000000..ab531e35e1f --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refschemaheader.java @@ -0,0 +1,7 @@ +package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers; + +import org.openapijsonschematools.client.components.headers.RefSchemaHeader; + +public class Refschemaheader extends RefSchemaHeader { + public static class Refschemaheader1 extends RefSchemaHeader1 {} +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/StringHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/StringHeader.java new file mode 100644 index 00000000000..339328f5b28 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/StringHeader.java @@ -0,0 +1,7 @@ +package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers; + +import org.openapijsonschematools.client.components.headers.RefStringHeader; + +public class StringHeader extends RefStringHeader { + public static class StringHeader1 extends RefStringHeader1 {} +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java index 00292572e1a..7f809c69c1b 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java @@ -8,15 +8,15 @@ import java.util.Objects; import java.util.Set; import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.components.headers.NumberHeader.NumberHeaderSchema; import org.openapijsonschematools.client.components.headers.int32jsoncontenttypeheader.content.applicationjson.Int32JsonContentTypeHeaderSchema; -import org.openapijsonschematools.client.components.headers.numberheader.NumberHeaderSchema; import org.openapijsonschematools.client.components.schemas.StringWithValidation; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.exceptions.UnsetPropertyException; import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.xexpiresafter.XExpiresAfterSchema; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.XExpiresAfter.XExpiresAfterSchema; import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.xratelimit.content.applicationjson.XRateLimitSchema; import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; import org.openapijsonschematools.client.schemas.GenericBuilder; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Int32.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Int32.java new file mode 100644 index 00000000000..e58a6bc7a89 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Int32.java @@ -0,0 +1,7 @@ +package org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers; + +import org.openapijsonschematools.client.components.headers.Int32JsonContentTypeHeader; + +public class Int32 extends Int32JsonContentTypeHeader { + public static class Int321 extends Int32JsonContentTypeHeader1 {} +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java new file mode 100644 index 00000000000..2659409bead --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java @@ -0,0 +1,7 @@ +package org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers; + +import org.openapijsonschematools.client.components.headers.NumberHeader; + +public class NumberHeader extends NumberHeader { + public static class NumberHeader1 extends NumberHeader1 {} +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Refcontentschemaheader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Refcontentschemaheader.java new file mode 100644 index 00000000000..2e61fb18770 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Refcontentschemaheader.java @@ -0,0 +1,7 @@ +package org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers; + +import org.openapijsonschematools.client.components.headers.RefContentSchemaHeader; + +public class Refcontentschemaheader extends RefContentSchemaHeader { + public static class Refcontentschemaheader1 extends RefContentSchemaHeader1 {} +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/XExpiresAfter.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/XExpiresAfter.java new file mode 100644 index 00000000000..16c17845941 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/XExpiresAfter.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers; + +import org.openapijsonschematools.client.header.SchemaHeader; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.xexpiresafter.XExpiresAfterSchema; + +public class XExpiresAfter { + + public static class XExpiresAfter1 extends SchemaHeader { + public XExpiresAfter1() { + super( + false, + null, + false, + XExpiresAfterSchema.XExpiresAfterSchema1.getInstance() + ); + } + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/XRateLimit.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/XRateLimit.java new file mode 100644 index 00000000000..0bc9ca1d34c --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/XRateLimit.java @@ -0,0 +1,34 @@ +package org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers; + +import org.openapijsonschematools.client.header.ContentHeader; +import org.openapijsonschematools.client.mediatype.MediaType; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.xratelimit.content.applicationjson.XRateLimitSchema; + +import java.util.AbstractMap; +import java.util.Map; + +public class XRateLimit { + + public record ApplicationjsonMediaType(XRateLimitSchema.XRateLimitSchema1 schema) implements MediaType { + public ApplicationjsonMediaType() { + this(XRateLimitSchema.XRateLimitSchema1.getInstance()); + } + @Override + public Void encoding() { + return null; + } + } + + public static class XRateLimit1 extends ContentHeader { + public XRateLimit1() { + super( + true, + null, + false, + Map.ofEntries( + new AbstractMap.SimpleEntry<>("application/json", new ApplicationjsonMediaType()) + ) + ); + } + } +} diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java index d6bb4c026c0..8f3a4f146f9 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java @@ -3194,7 +3194,8 @@ public CodegenHeader fromHeader(Header header, String sourceJsonPath) { LinkedHashMap finalContent = content; CodegenSchema finalSchema = schema; String example = getHeaderExampleValue(header); - codegenHeader = new CodegenHeader(description, example, finalVendorExtensions, required, finalContent, finalImports, componentModule, jsonPathPiece, explode, finalStyle, deprecated, finalSchema, refInfo); + String subpackage = getSubpackage(sourceJsonPath); + codegenHeader = new CodegenHeader(description, example, finalVendorExtensions, required, finalContent, finalImports, componentModule, jsonPathPiece, explode, finalStyle, deprecated, finalSchema, refInfo, subpackage); codegenHeaderCache.put(sourceJsonPath, codegenHeader); return codegenHeader; } @@ -3749,7 +3750,7 @@ protected void updateComponentsFilepath(String[] pathPieces) { return; } if (pathPieces[2].equals("headers")) { - pathPieces[3] = toHeaderFilename(pathPieces[3], null); + pathPieces[3] = toHeaderFilename(pathPieces[3], jsonPath); if (pathPieces.length >= 6 && pathPieces[4].equals("content")) { // #/components/headers/someHeader/content/application-json -> length 6 String contentType = ModelUtils.decodeSlashes(pathPieces[5]); @@ -3798,7 +3799,7 @@ protected void updateComponentsFilepath(String[] pathPieces) { } if (pathPieces[4].equals("headers")) { // #/components/responses/someResponse/headers/SomeHeader-> length 6 - pathPieces[5] = toHeaderFilename(pathPieces[5], null); + pathPieces[5] = toHeaderFilename(pathPieces[5], jsonPath); if (pathPieces.length >= 8 && pathPieces[6].equals("content")) { // #/components/responses/someResponse/headers/SomeHeader/content/application-json -> length 8 String contentType = ModelUtils.decodeSlashes(pathPieces[7]); @@ -3928,7 +3929,7 @@ private void updatePathsFilepath(String[] pathPieces) { } } else if (pathPieces[6].equals("headers")) { // #/paths/somePath/get/responses/200/headers/someHeader -> length 8 - pathPieces[7] = toHeaderFilename(pathPieces[7], null); + pathPieces[7] = toHeaderFilename(pathPieces[7], jsonPath); if (pathPieces.length >= 10 && pathPieces[8].equals("content")) { // #/paths/somePath/get/responses/200/headers/someHeader/content/application-json -> length 10 diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index cc19e7d3ece..bd09c085093 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -861,6 +861,13 @@ public void processOpts() { put("src/main/java/packagename/components/requestbodies/RequestBodyDoc.hbs", ".md"); }} ); + // header + jsonPathTemplateFiles.put( + CodegenConstants.JSON_PATH_LOCATION_TYPE.HEADER, + new HashMap<>() {{ + put("src/main/java/packagename/components/headers/Header.hbs", ".java"); + }} + ); // responses jsonPathTemplateFiles.put( CodegenConstants.JSON_PATH_LOCATION_TYPE.RESPONSE, @@ -958,7 +965,7 @@ public String toRequestBodyFilename(String componentName, String jsonPath) { String[] pathPieces = jsonPath.split("/"); if (pathPieces[2].equals("requestbodies") || pathPieces[2].equals("requestBodies")) { if (pathPieces.length == 4) { - // #/components/requestBodies/Pet (can collide with component schema Pet import) + // #/components/requestBodies/Pet return toModelName( componentName, null); } return toModuleFilename(componentName, null); @@ -970,6 +977,31 @@ public String toRequestBodyFilename(String componentName, String jsonPath) { return toModuleFilename(componentName, null); } + public String toHeaderFilename(String componentName, String jsonPath) { + String[] pathPieces = jsonPath.split("/"); + if (jsonPath.startsWith("#/components/headers/")) { + if (pathPieces.length == 4) { + // #/components/headers/SomeHeader + return toModelName(componentName, null); + } + // deeper paths + return toModuleFilename(componentName, jsonPath); + } else if (jsonPath.startsWith("#/components/responses/")) { + if (pathPieces.length == 6) { + // #/components/responses/SomeResponse/headers/SomeHeader + return toModelName(componentName, null); + } + // deeper paths + return toModuleFilename(componentName, jsonPath); + } + if (pathPieces.length == 8) { + // #/paths/somePath/verb/responses/200/headers/SomeHeader + return toModelName(componentName, null); + } + // deeper paths + return toModuleFilename(componentName, jsonPath); + } + public String getPascalCaseResponse(String componentName, String jsonPath) { if (jsonPath.startsWith("#/components/responses/")) { return toModelName(componentName, null); diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenHeader.java b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenHeader.java index ad4973c503a..6fc57ca7974 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenHeader.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenHeader.java @@ -43,8 +43,9 @@ public class CodegenHeader { public final Boolean deprecated; public final CodegenSchema schema; public final CodegenRefInfo refInfo; + public final String subpackage; - public CodegenHeader(CodegenText description, String example, Map vendorExtensions, Boolean required, LinkedHashMap content, TreeSet imports, boolean componentModule, CodegenKey jsonPathPiece, Boolean explode, String style, Boolean deprecated, CodegenSchema schema, CodegenRefInfo refInfo) { + public CodegenHeader(CodegenText description, String example, Map vendorExtensions, Boolean required, LinkedHashMap content, TreeSet imports, boolean componentModule, CodegenKey jsonPathPiece, Boolean explode, String style, Boolean deprecated, CodegenSchema schema, CodegenRefInfo refInfo, String subpackage) { this.description = description; this.example = example; this.vendorExtensions = vendorExtensions; @@ -58,6 +59,7 @@ public CodegenHeader(CodegenText description, String example, Map { + public {{@key.pascalCase}}MediaType() { + this({{#with this}}{{#with schema}}{{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}.getInstance(){{/with}}{{/with}}); + } + @Override + public Void encoding() { + return null; + } + } + {{/each}} + + public static class {{jsonPathPiece.pascalCase}}1 extends {{#if schema}}SchemaHeader{{else}}ContentHeader{{/if}} { + public {{jsonPathPiece.pascalCase}}1() { + super( + {{#eq required null}}false{{else}}{{required}}{{/eq}}, + null, + {{explode}}, + {{#if schema}} + {{#with schema}}{{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}.getInstance(){{/with}} + ); + {{else}} + Map.ofEntries( + {{#each content}} + new AbstractMap.SimpleEntry<>("{{{@key.original}}}", new {{@key.pascalCase}}MediaType()){{#unless @last}},{{/unless}} + {{/each}} + ) + ); + {{/if}} + } + } +} +{{/if}} +{{/with}} \ No newline at end of file From 1e9c6b04ba102ba086cdb022b85f72ef3da4d835 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Wed, 28 Feb 2024 15:53:56 -0800 Subject: [PATCH 09/32] Fixes headers schema import locations --- .../components/responses/headerswithnobody/Headers.java | 2 +- .../responses/successinlinecontentandheader/Headers.java | 2 +- .../responses/successwithjsonapiresponse/Headers.java | 4 ++-- .../userlogin/get/responses/code200response/Headers.java | 4 ++-- .../codegen/generators/DefaultGenerator.java | 4 +++- .../codegen/generators/JavaClientGenerator.java | 7 +++---- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java index 16394d94ae0..5a4894c3c3a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java @@ -8,7 +8,7 @@ import java.util.Objects; import java.util.Set; import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.components.responses.headerswithnobody.headers.Location.LocationSchema; +import org.openapijsonschematools.client.components.responses.headerswithnobody.headers.location.LocationSchema; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.exceptions.InvalidTypeException; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java index fa97cbd4c0b..209447c856e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java @@ -8,7 +8,7 @@ import java.util.Objects; import java.util.Set; import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.headers.SomeHeader.SomeHeaderSchema; +import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.headers.someheader.SomeHeaderSchema; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.exceptions.InvalidTypeException; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java index 66ae9543420..4e0a0752df7 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java @@ -8,9 +8,9 @@ import java.util.Objects; import java.util.Set; import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.components.headers.NumberHeader.NumberHeaderSchema; -import org.openapijsonschematools.client.components.headers.StringHeader.StringHeaderSchema; import org.openapijsonschematools.client.components.headers.int32jsoncontenttypeheader.content.applicationjson.Int32JsonContentTypeHeaderSchema; +import org.openapijsonschematools.client.components.headers.numberheader.NumberHeaderSchema; +import org.openapijsonschematools.client.components.headers.stringheader.StringHeaderSchema; import org.openapijsonschematools.client.components.schemas.StringWithValidation; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java index 7f809c69c1b..00292572e1a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java @@ -8,15 +8,15 @@ import java.util.Objects; import java.util.Set; import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.components.headers.NumberHeader.NumberHeaderSchema; import org.openapijsonschematools.client.components.headers.int32jsoncontenttypeheader.content.applicationjson.Int32JsonContentTypeHeaderSchema; +import org.openapijsonschematools.client.components.headers.numberheader.NumberHeaderSchema; import org.openapijsonschematools.client.components.schemas.StringWithValidation; import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.exceptions.UnsetPropertyException; import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.XExpiresAfter.XExpiresAfterSchema; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.xexpiresafter.XExpiresAfterSchema; import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.xratelimit.content.applicationjson.XRateLimitSchema; import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; import org.openapijsonschematools.client.schemas.GenericBuilder; diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java index 8f3a4f146f9..0a5bc4b7a77 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java @@ -3805,9 +3805,11 @@ protected void updateComponentsFilepath(String[] pathPieces) { String contentType = ModelUtils.decodeSlashes(pathPieces[7]); pathPieces[7] = toContentTypeFilename(contentType); if (pathPieces.length == 9) { - pathPieces[6] = getSchemaFilename(jsonPath); + // #/components/responses/someResponse/headers/SomeHeader/content/application-json/schema + pathPieces[8] = getSchemaFilename(jsonPath); } } else if (pathPieces.length == 7 && pathPieces[6].equals("schema")) { + // #/components/responses/someResponse/headers/SomeHeader/schema pathPieces[6] = getSchemaFilename(jsonPath); } } else if (pathPieces[4].equals("content")) { diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index bd09c085093..4bbb66201da 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -1307,11 +1307,10 @@ public String toRefClass(String ref, String sourceJsonPath, String expectedCompo @Override public String getRefModuleLocation(String ref) { - // modules are always in a package one above them, so strip off the last jsonPath fragment - String smallerRef = ref.substring(0, ref.lastIndexOf("/")); - String filePath = getFilepath(smallerRef); + String filePath = getFilepath(ref); String prefix = outputFolder + File.separatorChar + "src" + File.separatorChar + "main" + File.separatorChar + "java" + File.separatorChar; - String localFilepath = filePath.substring(prefix.length()); + // modules are always in a package one above them, so strip off the last jsonPath fragment + String localFilepath = filePath.substring(prefix.length(), filePath.lastIndexOf(File.separatorChar)); return localFilepath.replaceAll(String.valueOf(File.separatorChar), "."); } From f2fb2d25c523e9db403af74fb68a89f668271e17 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Wed, 28 Feb 2024 16:07:28 -0800 Subject: [PATCH 10/32] Fixes case where imported schema class was overwritten --- .../successwithjsonapiresponse/headers/NumberHeader.java | 4 ---- .../get/responses/code200response/headers/NumberHeader.java | 4 ---- .../src/main/java/packagename/components/headers/Header.hbs | 2 ++ 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java index 2bb4df8e423..9728f44108c 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java @@ -1,7 +1,3 @@ package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers; import org.openapijsonschematools.client.components.headers.NumberHeader; - -public class NumberHeader extends NumberHeader { - public static class NumberHeader1 extends NumberHeader1 {} -} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java index 2659409bead..3157a432ff8 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java @@ -1,7 +1,3 @@ package org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers; import org.openapijsonschematools.client.components.headers.NumberHeader; - -public class NumberHeader extends NumberHeader { - public static class NumberHeader1 extends NumberHeader1 {} -} diff --git a/src/main/resources/java/src/main/java/packagename/components/headers/Header.hbs b/src/main/resources/java/src/main/java/packagename/components/headers/Header.hbs index 6cf54449c49..d5f66524c6a 100644 --- a/src/main/resources/java/src/main/java/packagename/components/headers/Header.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/headers/Header.hbs @@ -5,10 +5,12 @@ package {{packageName}}.{{subpackage}}; {{#neq subpackage refInfo.ref.subpackage}} import {{packageName}}.{{refInfo.ref.subpackage}}.{{refInfo.refModule}}; {{/neq}} +{{#neq jsonPathPiece.pascalCase refInfo.ref.jsonPathPiece.pascalCase}} public class {{jsonPathPiece.pascalCase}} extends {{refInfo.refModule}} { public static class {{jsonPathPiece.pascalCase}}1 extends {{refInfo.refModule}}1 {} } +{{/neq}} {{else}} {{#if schema}} import {{packageName}}.header.SchemaHeader; From 62fc39a559ceddd1b797db00e28ed19258a59fad Mon Sep 17 00:00:00 2001 From: Justin Black Date: Wed, 28 Feb 2024 16:36:41 -0800 Subject: [PATCH 11/32] Adds missing header imports --- .../openapijsonschematools/client/mediatype/Encoding.java | 5 +++-- .../client/response/ResponseDeserializer.java | 3 ++- .../java/src/main/java/packagename/mediatype/Encoding.hbs | 5 +++-- .../main/java/packagename/response/ResponseDeserializer.hbs | 3 ++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java index d36fae2df8a..41a088888e8 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java @@ -2,12 +2,13 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.openapijsonschematools.client.parameter.ParameterStyle; +import org.openapijsonschematools.client.header.Header; import java.util.Map; public class Encoding { public final String contentType; - public final @Nullable Map headers; // todo change value to HeaderParameter + public final @Nullable Map headers; public final @Nullable ParameterStyle style; public final boolean explode; public final boolean allowReserved; @@ -19,7 +20,7 @@ public Encoding(String contentType) { explode = false; allowReserved = false; } - public Encoding(String contentType, @Nullable Map headers) { + public Encoding(String contentType, @Nullable Map headers) { this.contentType = contentType; this.headers = headers; style = null; diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java index f99b02ab832..0ffcb986558 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java @@ -14,10 +14,11 @@ import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.schemas.validation.JsonSchema; import org.openapijsonschematools.client.contenttype.ContentTypeDetector; +import org.openapijsonschematools.client.header.Header; public abstract class ResponseDeserializer { public final Map content; - public final @Nullable Map headers; // todo change the value to header + public final @Nullable Map headers; private static final Gson gson = new GsonBuilder() .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) diff --git a/src/main/resources/java/src/main/java/packagename/mediatype/Encoding.hbs b/src/main/resources/java/src/main/java/packagename/mediatype/Encoding.hbs index 5861b558d7e..5d6d9d6ec49 100644 --- a/src/main/resources/java/src/main/java/packagename/mediatype/Encoding.hbs +++ b/src/main/resources/java/src/main/java/packagename/mediatype/Encoding.hbs @@ -2,12 +2,13 @@ package {{{packageName}}}.mediatype; import org.checkerframework.checker.nullness.qual.Nullable; import {{{packageName}}}.parameter.ParameterStyle; +import {{{packageName}}}.header.Header; import java.util.Map; public class Encoding { public final String contentType; - public final @Nullable Map headers; // todo change value to HeaderParameter + public final @Nullable Map headers; public final @Nullable ParameterStyle style; public final boolean explode; public final boolean allowReserved; @@ -19,7 +20,7 @@ public class Encoding { explode = false; allowReserved = false; } - public Encoding(String contentType, @Nullable Map headers) { + public Encoding(String contentType, @Nullable Map headers) { this.contentType = contentType; this.headers = headers; style = null; diff --git a/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs index b88aef90d9e..0b3cfa02a47 100644 --- a/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs +++ b/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs @@ -14,10 +14,11 @@ import com.google.gson.ToNumberPolicy; import {{{packageName}}}.configurations.SchemaConfiguration; import {{{packageName}}}.schemas.validation.JsonSchema; import {{{packageName}}}.contenttype.ContentTypeDetector; +import {{{packageName}}}.header.Header; public abstract class ResponseDeserializer { public final Map content; - public final @Nullable Map headers; // todo change the value to header + public final @Nullable Map headers; private static final Gson gson = new GsonBuilder() .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) From fbb3b29cb751c666bdf1fa0e491ea52a35dc5e1d Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 12:26:14 -0800 Subject: [PATCH 12/32] Adds header docs --- .../petstore/java/.openapi-generator/FILES | 6 ++ samples/client/petstore/java/README.md | 11 +++ .../headers/Int32JsonContentTypeHeader.md | 53 +++++++++++ .../docs/components/headers/NumberHeader.md | 34 +++++++ .../headers/RefContentSchemaHeader.md | 53 +++++++++++ .../components/headers/RefSchemaHeader.md | 34 +++++++ .../components/headers/RefStringHeader.md | 20 ++++ .../docs/components/headers/StringHeader.md | 34 +++++++ .../client/header/Header.java | 1 + .../generators/JavaClientGenerator.java | 6 ++ src/main/resources/java/README.hbs | 12 +++ .../components/headers/HeaderDoc.hbs | 91 +++++++++++++++++++ .../main/java/packagename/header/Header.hbs | 1 + 13 files changed, 356 insertions(+) create mode 100644 samples/client/petstore/java/docs/components/headers/Int32JsonContentTypeHeader.md create mode 100644 samples/client/petstore/java/docs/components/headers/NumberHeader.md create mode 100644 samples/client/petstore/java/docs/components/headers/RefContentSchemaHeader.md create mode 100644 samples/client/petstore/java/docs/components/headers/RefSchemaHeader.md create mode 100644 samples/client/petstore/java/docs/components/headers/RefStringHeader.md create mode 100644 samples/client/petstore/java/docs/components/headers/StringHeader.md create mode 100644 src/main/resources/java/src/main/java/packagename/components/headers/HeaderDoc.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 4d60d895970..4234e4311ca 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -1,4 +1,10 @@ README.md +docs/components/headers/Int32JsonContentTypeHeader.md +docs/components/headers/NumberHeader.md +docs/components/headers/RefContentSchemaHeader.md +docs/components/headers/RefSchemaHeader.md +docs/components/headers/RefStringHeader.md +docs/components/headers/StringHeader.md docs/components/headers/int32jsoncontenttypeheader/content/applicationjson/Int32JsonContentTypeHeaderSchema.md docs/components/headers/numberheader/NumberHeaderSchema.md docs/components/headers/refcontentschemaheader/content/applicationjson/RefContentSchemaHeaderSchema.md diff --git a/samples/client/petstore/java/README.md b/samples/client/petstore/java/README.md index 72667a4c61d..e2b14bbe1bb 100644 --- a/samples/client/petstore/java/README.md +++ b/samples/client/petstore/java/README.md @@ -320,6 +320,17 @@ Class | Description [SuccessWithJsonApiResponse.SuccessWithJsonApiResponse1](docs/components/responses/SuccessWithJsonApiResponse.md#successwithjsonapiresponse1) | successful operation [SuccessfulXmlAndJsonArrayOfPet.SuccessfulXmlAndJsonArrayOfPet1](docs/components/responses/SuccessfulXmlAndJsonArrayOfPet.md#successfulxmlandjsonarrayofpet1) | successful operation, multiple content types +## Component Headers + +Class | Description +----- | ------------ +[Int32JsonContentTypeHeader.Int32JsonContentTypeHeader1](docs/components/headers/Int32JsonContentTypeHeader.md#int32jsoncontenttypeheader1) | int32 JSON content-type header +[NumberHeader.NumberHeader1](docs/components/headers/NumberHeader.md#numberheader1) | number header description +[RefContentSchemaHeader.RefContentSchemaHeader1](docs/components/headers/RefContentSchemaHeader.md#refcontentschemaheader1) | int32 JSON content-type header +[RefSchemaHeader.RefSchemaHeader1](docs/components/headers/RefSchemaHeader.md#refschemaheader1) | header that has a ref in the schema +[RefStringHeader.RefStringHeader1](docs/components/headers/RefStringHeader.md#refstringheader1) | +[StringHeader.StringHeader1](docs/components/headers/StringHeader.md#stringheader1) | string header description + ## Component SecuritySchemes | Class | Description | diff --git a/samples/client/petstore/java/docs/components/headers/Int32JsonContentTypeHeader.md b/samples/client/petstore/java/docs/components/headers/Int32JsonContentTypeHeader.md new file mode 100644 index 00000000000..7ffda102982 --- /dev/null +++ b/samples/client/petstore/java/docs/components/headers/Int32JsonContentTypeHeader.md @@ -0,0 +1,53 @@ +# Int32JsonContentTypeHeader +Int32JsonContentTypeHeader.java + +public class Int32JsonContentTypeHeader + +A class that contains necessary nested header classes +- a class that implements MediaType to store content schema info +- a class that extends SchemaHeader/ContentHeader and is used to deserialize the header value + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | --------------------- | +| record | [Int32JsonContentTypeHeader.ApplicationjsonMediaType](#applicationjsonmediatype)
record storing schema + encoding for a specific contentType | +| static class | [Int32JsonContentTypeHeader.Int32JsonContentTypeHeader1](#int32jsoncontenttypeheader1)
class that deserializes a header | + + +## ApplicationjsonMediaType +public record ApplicationjsonMediaType
+implements [MediaType<[Int32JsonContentTypeHeaderSchema.Int32JsonContentTypeHeaderSchema1](../../components/headers/int32jsoncontenttypeheader/content/applicationjson/Int32JsonContentTypeHeaderSchema.md#int32jsoncontenttypeheaderschema1), Void> + +class storing schema info for a specific contentType + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| ApplicationjsonMediaType()
Creates an instance | + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| [Int32JsonContentTypeHeaderSchema.Int32JsonContentTypeHeaderSchema1](../../components/headers/int32jsoncontenttypeheader/content/applicationjson/Int32JsonContentTypeHeaderSchema.md#int32jsoncontenttypeheaderschema1) | schema()
the schema for this MediaType | +| Void | encoding()
the encoding info | + +## Int32JsonContentTypeHeader1 +public static class Int32JsonContentTypeHeader1
+ +a class that deserializes a header value + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| Int32JsonContentTypeHeader1()
Creates an instance | + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | --------------------- | +| boolean | required = true
whether the header is required | +| @Nullable Boolean allowReserved | null | +| @Nullable ParameterStyle | ParameterStyle.SIMPLE | +| @Nullable Boolean explode | false | +| Map | content = Map.ofEntries(
    new AbstractMap.SimpleEntry<>("application/json", new [ApplicationjsonMediaType](#applicationjsonmediatype)())
)
the contentType to schema info | + +[[Back to top]](#top) [[Back to Component Headers]](../../../README.md#Component-Headers) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/headers/NumberHeader.md b/samples/client/petstore/java/docs/components/headers/NumberHeader.md new file mode 100644 index 00000000000..b434092e793 --- /dev/null +++ b/samples/client/petstore/java/docs/components/headers/NumberHeader.md @@ -0,0 +1,34 @@ +# NumberHeader +NumberHeader.java + +public class NumberHeader + +A class that contains necessary nested header classes +- a class that extends SchemaHeader/ContentHeader and is used to deserialize the header value + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | --------------------- | +| static class | [NumberHeader.NumberHeader1](#numberheader1)
class that deserializes a header | + + +## NumberHeader1 +public static class NumberHeader1
+ +a class that deserializes a header value + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| NumberHeader1()
Creates an instance | + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | --------------------- | +| boolean | required = false
whether the header is required | +| @Nullable Boolean allowReserved | null | +| @Nullable ParameterStyle | ParameterStyle.SIMPLE | +| @Nullable Boolean explode | false | +| JsonSchema | schema = NumberHeaderSchema.NumberHeaderSchema1.getInstance() + +[[Back to top]](#top) [[Back to Component Headers]](../../../README.md#Component-Headers) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/headers/RefContentSchemaHeader.md b/samples/client/petstore/java/docs/components/headers/RefContentSchemaHeader.md new file mode 100644 index 00000000000..2c1812ead4d --- /dev/null +++ b/samples/client/petstore/java/docs/components/headers/RefContentSchemaHeader.md @@ -0,0 +1,53 @@ +# RefContentSchemaHeader +RefContentSchemaHeader.java + +public class RefContentSchemaHeader + +A class that contains necessary nested header classes +- a class that implements MediaType to store content schema info +- a class that extends SchemaHeader/ContentHeader and is used to deserialize the header value + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | --------------------- | +| record | [RefContentSchemaHeader.ApplicationjsonMediaType](#applicationjsonmediatype)
record storing schema + encoding for a specific contentType | +| static class | [RefContentSchemaHeader.RefContentSchemaHeader1](#refcontentschemaheader1)
class that deserializes a header | + + +## ApplicationjsonMediaType +public record ApplicationjsonMediaType
+implements [MediaType<[RefContentSchemaHeaderSchema.RefContentSchemaHeaderSchema1](../../components/headers/refcontentschemaheader/content/applicationjson/RefContentSchemaHeaderSchema.md#refcontentschemaheaderschema1), Void> + +class storing schema info for a specific contentType + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| ApplicationjsonMediaType()
Creates an instance | + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| [RefContentSchemaHeaderSchema.RefContentSchemaHeaderSchema1](../../components/headers/refcontentschemaheader/content/applicationjson/RefContentSchemaHeaderSchema.md#refcontentschemaheaderschema1) | schema()
the schema for this MediaType | +| Void | encoding()
the encoding info | + +## RefContentSchemaHeader1 +public static class RefContentSchemaHeader1
+ +a class that deserializes a header value + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| RefContentSchemaHeader1()
Creates an instance | + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | --------------------- | +| boolean | required = true
whether the header is required | +| @Nullable Boolean allowReserved | null | +| @Nullable ParameterStyle | ParameterStyle.SIMPLE | +| @Nullable Boolean explode | false | +| Map | content = Map.ofEntries(
    new AbstractMap.SimpleEntry<>("application/json", new [ApplicationjsonMediaType](#applicationjsonmediatype)())
)
the contentType to schema info | + +[[Back to top]](#top) [[Back to Component Headers]](../../../README.md#Component-Headers) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/headers/RefSchemaHeader.md b/samples/client/petstore/java/docs/components/headers/RefSchemaHeader.md new file mode 100644 index 00000000000..0cc894085f7 --- /dev/null +++ b/samples/client/petstore/java/docs/components/headers/RefSchemaHeader.md @@ -0,0 +1,34 @@ +# RefSchemaHeader +RefSchemaHeader.java + +public class RefSchemaHeader + +A class that contains necessary nested header classes +- a class that extends SchemaHeader/ContentHeader and is used to deserialize the header value + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | --------------------- | +| static class | [RefSchemaHeader.RefSchemaHeader1](#refschemaheader1)
class that deserializes a header | + + +## RefSchemaHeader1 +public static class RefSchemaHeader1
+ +a class that deserializes a header value + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| RefSchemaHeader1()
Creates an instance | + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | --------------------- | +| boolean | required = true
whether the header is required | +| @Nullable Boolean allowReserved | null | +| @Nullable ParameterStyle | ParameterStyle.SIMPLE | +| @Nullable Boolean explode | false | +| JsonSchema | schema = RefSchemaHeaderSchema.RefSchemaHeaderSchema1.getInstance() + +[[Back to top]](#top) [[Back to Component Headers]](../../../README.md#Component-Headers) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/headers/RefStringHeader.md b/samples/client/petstore/java/docs/components/headers/RefStringHeader.md new file mode 100644 index 00000000000..8944cf49914 --- /dev/null +++ b/samples/client/petstore/java/docs/components/headers/RefStringHeader.md @@ -0,0 +1,20 @@ +# RefStringHeader +RefStringHeader.java + +public class RefStringHeader extends [StringHeader](../../components/headers/StringHeader.md) + +A class (extended from the $ref class) that contains necessary nested header classes +- a class that extends SchemaHeader/ContentHeader and is used to deserialize header content + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | --------------------- | +| static class | [RefStringHeader.RefStringHeader1](#refstringheader1)
class that deserializes header value | + +## RefStringHeader1 +public static class RefStringHeader1 extends [StringHeader](../../components/headers/StringHeader.md#stringheader1)
+ +a class that deserializes header, extended from the $ref class + + +[[Back to top]](#top) [[Back to Component Headers]](../../../README.md#Component-Headers) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/headers/StringHeader.md b/samples/client/petstore/java/docs/components/headers/StringHeader.md new file mode 100644 index 00000000000..77419e9bcbf --- /dev/null +++ b/samples/client/petstore/java/docs/components/headers/StringHeader.md @@ -0,0 +1,34 @@ +# StringHeader +StringHeader.java + +public class StringHeader + +A class that contains necessary nested header classes +- a class that extends SchemaHeader/ContentHeader and is used to deserialize the header value + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | --------------------- | +| static class | [StringHeader.StringHeader1](#stringheader1)
class that deserializes a header | + + +## StringHeader1 +public static class StringHeader1
+ +a class that deserializes a header value + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| StringHeader1()
Creates an instance | + +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | --------------------- | +| boolean | required = true
whether the header is required | +| @Nullable Boolean allowReserved | null | +| @Nullable ParameterStyle | ParameterStyle.SIMPLE | +| @Nullable Boolean explode | false | +| JsonSchema | schema = StringHeaderSchema.StringHeaderSchema1.getInstance() + +[[Back to top]](#top) [[Back to Component Headers]](../../../README.md#Component-Headers) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java index 85cb6fd1dbe..69b34057a1d 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java @@ -6,5 +6,6 @@ import java.net.http.HttpHeaders; public interface Header { + // todo add deserialize HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration); } \ No newline at end of file diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 4bbb66201da..2268ae04f99 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -868,6 +868,12 @@ public void processOpts() { put("src/main/java/packagename/components/headers/Header.hbs", ".java"); }} ); + jsonPathDocTemplateFiles.put( + CodegenConstants.JSON_PATH_LOCATION_TYPE.HEADER, + new HashMap<>() {{ + put("src/main/java/packagename/components/headers/HeaderDoc.hbs", ".md"); + }} + ); // responses jsonPathTemplateFiles.put( CodegenConstants.JSON_PATH_LOCATION_TYPE.RESPONSE, diff --git a/src/main/resources/java/README.hbs b/src/main/resources/java/README.hbs index 2477d62306e..a648deacabc 100644 --- a/src/main/resources/java/README.hbs +++ b/src/main/resources/java/README.hbs @@ -197,6 +197,18 @@ Class | Description {{/with}} {{/each}} {{/if}} +{{#if headers}} + +## Component Headers + +Class | Description +----- | ------------ +{{#each headers}} + {{#with this}} +[{{jsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}1](docs/components/headers/{{jsonPathPiece.pascalCase}}.md#{{jsonPathPiece.kebabCase}}1) |{{#if description}} {{description.originalWithBr}}{{/if}} + {{/with}} +{{/each}} +{{/if}} {{#if securitySchemes}} ## Component SecuritySchemes diff --git a/src/main/resources/java/src/main/java/packagename/components/headers/HeaderDoc.hbs b/src/main/resources/java/src/main/java/packagename/components/headers/HeaderDoc.hbs new file mode 100644 index 00000000000..2b085caf265 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/components/headers/HeaderDoc.hbs @@ -0,0 +1,91 @@ +{{#with header}} +{{#eq identifierPieces.size 0}} +{{> src/main/java/packagename/components/_helper_header_from_identifier_pieces identifierPieces=(append identifierPieces jsonPathPiece) }} +{{else}} +{{> src/main/java/packagename/components/_helper_header_from_identifier_pieces }} +{{/eq}} +{{#if componentModule}} +{{jsonPathPiece.pascalCase}}.java +{{/if}} + +{{#if refInfo}} +public class {{jsonPathPiece.pascalCase}} extends [{{refInfo.refClass}}](../../components/headers/{{refInfo.refClass}}.md) + +A class (extended from the $ref class) that contains necessary nested header classes +- a class that extends SchemaHeader/ContentHeader and is used to deserialize header content + +{{headerSize}}# Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | --------------------- | +| static class | [{{jsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}1](#{{> src/main/java/packagename/components/_helper_anchor_id identifierPieces=(append identifierPieces (join jsonPathPiece.kebabCase "1" "")) }})
class that deserializes header value | + +{{> src/main/java/packagename/components/_helper_header_from_identifier_pieces headerSize=(join headerSize "#" "") identifierPieces=(append identifierPieces (join jsonPathPiece.pascalCase "1" "")) }} +public static class {{jsonPathPiece.pascalCase}}1 extends [{{refInfo.refClass}}](../../components/headers/{{refInfo.refClass}}.md#{{refInfo.ref.jsonPathPiece.kebabCase}}1)
+ +a class that deserializes header, extended from the $ref class + +{{else}} +public class {{jsonPathPiece.pascalCase}} + +A class that contains necessary nested header classes +{{#if content}} +- a class that implements MediaType to store content schema info +{{/if}} +- a class that extends SchemaHeader/ContentHeader and is used to deserialize the header value + +{{headerSize}}# Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | --------------------- | +{{#each content}} +| record | [{{jsonPathPiece.pascalCase}}.{{@key.pascalCase}}MediaType](#{{@key.kebabCase}}mediatype)
record storing schema + encoding for a specific contentType | +{{/each}} +| static class | [{{jsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}1](#{{> src/main/java/packagename/components/_helper_anchor_id identifierPieces=(append identifierPieces (join jsonPathPiece.kebabCase "1" "")) }})
class that deserializes a header | + +{{#each content}} + +{{> src/main/java/packagename/components/_helper_header_from_identifier_pieces headerSize=(join headerSize "#" "") identifierPieces=(append identifierPieces (join @key.pascalCase "MediaType" "")) }} +public record {{@key.pascalCase}}MediaType
+implements [MediaType<{{#with this}}{{#with schema}}[{{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}]({{docRoot}}{{pathFromDocRoot}}.md#{{jsonPathPiece.kebabCase}}){{/with}}{{/with}}, Void> + +class storing schema info for a specific contentType + +{{headerSize}}## Constructor Summary +| Constructor and Description | +| --------------------------- | +| {{@key.pascalCase}}MediaType()
Creates an instance | + +{{headerSize}}## Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| {{#with this}}{{#with schema}}[{{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}]({{docRoot}}{{pathFromDocRoot}}.md#{{jsonPathPiece.kebabCase}}){{/with}}{{/with}} | schema()
the schema for this MediaType | +| Void | encoding()
the encoding info | +{{/each}} + +{{> src/main/java/packagename/components/_helper_header_from_identifier_pieces headerSize=(join headerSize "#" "") identifierPieces=(append identifierPieces (join jsonPathPiece.pascalCase "1" "")) }} +public static class {{jsonPathPiece.pascalCase}}1
+ +a class that deserializes a header value + +{{headerSize}}## Constructor Summary +| Constructor and Description | +| --------------------------- | +| {{jsonPathPiece.pascalCase}}1()
Creates an instance | + +{{headerSize}}## Field Summary +| Modifier and Type | Field and Description | +| ----------------- | --------------------- | +| boolean | required = {{#eq required null}}false{{else}}{{required}}{{/eq}}
whether the header is required | +| @Nullable Boolean allowReserved | null | +| @Nullable ParameterStyle | ParameterStyle.SIMPLE | +| @Nullable Boolean explode | {{explode}} | + {{#if content}} +| Map | content = Map.ofEntries(
{{#each content}}    new AbstractMap.SimpleEntry<>("{{{@key.original}}}", new [{{@key.pascalCase}}MediaType](#{{@key.kebabCase}}mediatype)()){{#unless @last}},{{/unless}}
{{/each}})
the contentType to schema info | + {{else}} +| JsonSchema | schema = {{#with schema}}{{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}.getInstance(){{/with}} + {{/if}} +{{/if}} +{{#if componentModule}} + +[[Back to top]](#top) {{> _helper_footer_links readmePath="../../../" headersLink=true}} +{{/if}} +{{/with}} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/header/Header.hbs b/src/main/resources/java/src/main/java/packagename/header/Header.hbs index 142664bbfc0..6e4a1a2cc48 100644 --- a/src/main/resources/java/src/main/java/packagename/header/Header.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/Header.hbs @@ -6,5 +6,6 @@ import {{{packageName}}}.configurations.SchemaConfiguration; import java.net.http.HttpHeaders; public interface Header { + // todo add deserialize HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration); } \ No newline at end of file From 6496a406e9ebd49f10993f419f16fcc9e46bbdd5 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 13:35:36 -0800 Subject: [PATCH 13/32] Adds header deserialization for individual headers only --- .../petstore/java/.openapi-generator/FILES | 1 + .../contenttype/ContentTypeDeserializer.java | 18 ++++++ .../client/header/ContentHeader.java | 23 +++++++- .../client/header/Header.java | 5 +- .../client/header/SchemaHeader.java | 58 ++++++++++++++++++- .../client/response/ResponseDeserializer.java | 3 +- .../client/header/ContentHeaderTest.java | 2 +- .../client/header/SchemaHeaderTest.java | 4 +- .../generators/JavaClientGenerator.java | 4 ++ .../contenttype/ContentTypeDeserializer.hbs | 18 ++++++ .../java/packagename/header/ContentHeader.hbs | 23 +++++++- .../main/java/packagename/header/Header.hbs | 5 +- .../java/packagename/header/SchemaHeader.hbs | 58 ++++++++++++++++++- .../response/ResponseDeserializer.hbs | 3 +- .../packagename/header/ContentHeaderTest.hbs | 2 +- .../packagename/header/SchemaHeaderTest.hbs | 4 +- 16 files changed, 211 insertions(+), 20 deletions(-) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java create mode 100644 src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeDeserializer.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 4234e4311ca..2899cffa735 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -524,6 +524,7 @@ src/main/java/org/openapijsonschematools/client/components/securityschemes/Petst src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java src/main/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/client/configurations/SchemaConfiguration.java +src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java src/main/java/org/openapijsonschematools/client/exceptions/ApiException.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java new file mode 100644 index 00000000000..f9ef315ea84 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.contenttype; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class ContentTypeDeserializer { + private static final Gson gson = new GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .create(); + + @SuppressWarnings("nullness") + public static @Nullable Object fromJson(String json) { + return gson.fromJson(json, Object.class); + } +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java index c2c227f6835..2b09f2f77df 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java @@ -4,6 +4,7 @@ import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.contenttype.ContentTypeDetector; import org.openapijsonschematools.client.contenttype.ContentTypeSerializer; +import org.openapijsonschematools.client.contenttype.ContentTypeDeserializer; import org.openapijsonschematools.client.mediatype.MediaType; import org.openapijsonschematools.client.parameter.ParameterStyle; @@ -27,9 +28,9 @@ private static HttpHeaders toHeaders(String name, String value) { } @Override - public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { + public HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) { for (Map.Entry> entry: content.entrySet()) { - var castInData = skipValidation ? inData : entry.getValue().schema().validate(inData, configuration); + var castInData = validate ? entry.getValue().schema().validate(inData, configuration) : inData ; String contentType = entry.getKey(); if (ContentTypeDetector.contentTypeIsJson(contentType)) { var value = ContentTypeSerializer.toJson(castInData); @@ -40,4 +41,22 @@ public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipV } throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair"); } + + @Override + public @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration) { + String inDataJoined = String.join(",", inData); // unsure if this is needed + @Nullable Object deserializedJson = ContentTypeDeserializer.fromJson(inDataJoined); + if (validate) { + for (Map.Entry> entry: content.entrySet()) { + String contentType = entry.getKey(); + if (ContentTypeDetector.contentTypeIsJson(contentType)) { + return entry.getValue().schema().validate(deserializedJson, configuration); + } else { + throw new RuntimeException("Header deserialization of "+contentType+" has not yet been implemented"); + } + } + throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair"); + } + return deserializedJson; + } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java index 69b34057a1d..ac9f6274b0d 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/Header.java @@ -4,8 +4,9 @@ import org.openapijsonschematools.client.configurations.SchemaConfiguration; import java.net.http.HttpHeaders; +import java.util.List; public interface Header { - // todo add deserialize - HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration); + HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration); + @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration); } \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java index ae060abaaba..e2bfce785cd 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java @@ -2,12 +2,17 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.contenttype.ContentTypeDeserializer; import org.openapijsonschematools.client.parameter.ParameterStyle; import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaFactory; +import org.openapijsonschematools.client.schemas.validation.UnsetAnyTypeJsonSchema; import java.net.http.HttpHeaders; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.BiPredicate; public class SchemaHeader extends HeaderBase implements Header { @@ -25,10 +30,59 @@ private static HttpHeaders toHeaders(String name, String value) { } @Override - public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { - var castInData = skipValidation ? inData : schema.validate(inData, configuration); + public HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) { + var castInData = validate ? schema.validate(inData, configuration) : inData; boolean usedExplode = explode != null && explode; var value = StyleSimpleSerializer.serializeSimple(castInData, name, usedExplode, false); return toHeaders(name, value); } + + private static final Set> VOID_TYPES = Set.of(Void.class); + private static final Set> BOOLEAN_TYPES = Set.of(Boolean.class); + private static final Set> NUMERIC_TYPES = Set.of( + Integer.class, + Long.class, + Float.class, + Double.class + ); + private static final Set> STRING_TYPES = Set.of(String.class); + private static final Set> LIST_TYPES = Set.of(List.class); + private static final Set> MAP_TYPES = Set.of(Map.class); + + private @Nullable Object getCastInData(JsonSchema schema, List inData) { + if (schema.type == null) { + return inData; + } else if (schema.type.size() == 1) { + if (schema.type.equals(BOOLEAN_TYPES)) { + throw new RuntimeException("Boolean serialization is not defined in Rfc6570, there is no agreed upon way to sent a boolean, send a string enum instead"); + } else if (schema.type.equals(VOID_TYPES) && inData.size() == 1 && inData.get(0).isEmpty()) { + return null; + } else if (schema.type.equals(NUMERIC_TYPES) && inData.size() == 1) { + return ContentTypeDeserializer.fromJson(inData.get(0)); + } else if (schema.type.equals(STRING_TYPES) && inData.size() == 1) { + return inData; + } else if (schema.type.equals(LIST_TYPES)) { + Class> itemsSchemaCls = schema.items == null ? UnsetAnyTypeJsonSchema.UnsetAnyTypeJsonSchema1.class : schema.items; + JsonSchema itemSchema = JsonSchemaFactory.getInstance(itemsSchemaCls); + List<@Nullable Object> castList = new ArrayList<>(); + for (String inDataItem: inData) { + @Nullable Object castInDataItem = getCastInData(itemSchema, List.of(inDataItem)); + castList.add(castInDataItem); + } + return castList; + } else if (schema.type.equals(MAP_TYPES)) { + throw new RuntimeException("Header map deserialization has not yet been implemented"); + } + } + throw new RuntimeException("Header deserialization for schemas with multiple types has not yet been implemented"); + } + + @Override + public @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration) { + @Nullable Object castInData = getCastInData(schema, inData); + if (validate) { + return schema.validate(castInData, configuration); + } + return castInData; + } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java index 0ffcb986558..ac60319675a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java @@ -14,6 +14,7 @@ import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.schemas.validation.JsonSchema; import org.openapijsonschematools.client.contenttype.ContentTypeDetector; +import org.openapijsonschematools.client.contenttype.ContentTypeDeserializer; import org.openapijsonschematools.client.header.Header; public abstract class ResponseDeserializer { @@ -34,7 +35,7 @@ public ResponseDeserializer(Map content) { protected @Nullable Object deserializeJson(byte[] body) { String bodyStr = new String(body, StandardCharsets.UTF_8); - return gson.fromJson(bodyStr, Object.class); + return ContentTypeDeserializer.fromJson(bodyStr); } protected String deserializeTextPlain(byte[] body) { diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java index 82912ecdced..30347681cbf 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java @@ -110,7 +110,7 @@ public Void encoding() { testCase.explode, content ); - var serialization = header.serialize(testCase.payload, "color", true, configuration); + var serialization = header.serialize(testCase.payload, "color", false, configuration); Assert.assertEquals(HttpHeaders.of(testCase.expectedSerialization, headerFilter), serialization); } } diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java index d2071dae74d..5c6ef552e1c 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java @@ -89,7 +89,7 @@ public void testSerialization() { testCase.explode, AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance() ); - var serialization = header.serialize(testCase.payload, "color", true, configuration); + var serialization = header.serialize(testCase.payload, "color", false, configuration); Assert.assertEquals(HttpHeaders.of(testCase.expectedSerialization, headerFilter), serialization); } SchemaHeader boolHeader = new SchemaHeader( @@ -101,7 +101,7 @@ public void testSerialization() { for (boolean value: Set.of(true, false)) { Assert.assertThrows( InvalidTypeException.class, - () -> boolHeader.serialize(value, "color", true, configuration) + () -> boolHeader.serialize(value, "color", false, configuration) ); } } diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 2268ae04f99..faaad7d259b 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -777,6 +777,10 @@ public void processOpts() { "src/main/java/packagename/contenttype/ContentTypeSerializer.hbs", packagePath() + File.separatorChar + "contenttype", "ContentTypeSerializer.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/contenttype/ContentTypeDeserializer.hbs", + packagePath() + File.separatorChar + "contenttype", + "ContentTypeDeserializer.java")); // header supportingFiles.add(new SupportingFile( "src/main/java/packagename/header/Header.hbs", diff --git a/src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeDeserializer.hbs new file mode 100644 index 00000000000..f9ef315ea84 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/contenttype/ContentTypeDeserializer.hbs @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.contenttype; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class ContentTypeDeserializer { + private static final Gson gson = new GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .create(); + + @SuppressWarnings("nullness") + public static @Nullable Object fromJson(String json) { + return gson.fromJson(json, Object.class); + } +} diff --git a/src/main/resources/java/src/main/java/packagename/header/ContentHeader.hbs b/src/main/resources/java/src/main/java/packagename/header/ContentHeader.hbs index 30ca40c5a24..ced388d5803 100644 --- a/src/main/resources/java/src/main/java/packagename/header/ContentHeader.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/ContentHeader.hbs @@ -4,6 +4,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import {{{packageName}}}.configurations.SchemaConfiguration; import {{{packageName}}}.contenttype.ContentTypeDetector; import {{{packageName}}}.contenttype.ContentTypeSerializer; +import {{{packageName}}}.contenttype.ContentTypeDeserializer; import {{{packageName}}}.mediatype.MediaType; import {{{packageName}}}.parameter.ParameterStyle; @@ -27,9 +28,9 @@ public class ContentHeader extends HeaderBase implements Header { } @Override - public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { + public HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) { for (Map.Entry> entry: content.entrySet()) { - var castInData = skipValidation ? inData : entry.getValue().schema().validate(inData, configuration); + var castInData = validate ? entry.getValue().schema().validate(inData, configuration) : inData ; String contentType = entry.getKey(); if (ContentTypeDetector.contentTypeIsJson(contentType)) { var value = ContentTypeSerializer.toJson(castInData); @@ -40,4 +41,22 @@ public class ContentHeader extends HeaderBase implements Header { } throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair"); } + + @Override + public @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration) { + String inDataJoined = String.join(",", inData); // unsure if this is needed + @Nullable Object deserializedJson = ContentTypeDeserializer.fromJson(inDataJoined); + if (validate) { + for (Map.Entry> entry: content.entrySet()) { + String contentType = entry.getKey(); + if (ContentTypeDetector.contentTypeIsJson(contentType)) { + return entry.getValue().schema().validate(deserializedJson, configuration); + } else { + throw new RuntimeException("Header deserialization of "+contentType+" has not yet been implemented"); + } + } + throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair"); + } + return deserializedJson; + } } \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/header/Header.hbs b/src/main/resources/java/src/main/java/packagename/header/Header.hbs index 6e4a1a2cc48..30a90da0468 100644 --- a/src/main/resources/java/src/main/java/packagename/header/Header.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/Header.hbs @@ -4,8 +4,9 @@ import org.checkerframework.checker.nullness.qual.Nullable; import {{{packageName}}}.configurations.SchemaConfiguration; import java.net.http.HttpHeaders; +import java.util.List; public interface Header { - // todo add deserialize - HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration); + HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration); + @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration); } \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs b/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs index 4040e017c1a..83c035183bb 100644 --- a/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs @@ -2,12 +2,17 @@ package {{{packageName}}}.header; import org.checkerframework.checker.nullness.qual.Nullable; import {{{packageName}}}.configurations.SchemaConfiguration; +import {{{packageName}}}.contenttype.ContentTypeDeserializer; import {{{packageName}}}.parameter.ParameterStyle; import {{{packageName}}}.schemas.validation.JsonSchema; +import {{{packageName}}}.schemas.validation.JsonSchemaFactory; +import {{{packageName}}}.schemas.validation.UnsetAnyTypeJsonSchema; import java.net.http.HttpHeaders; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.BiPredicate; public class SchemaHeader extends HeaderBase implements Header { @@ -25,10 +30,59 @@ public class SchemaHeader extends HeaderBase implements Header { } @Override - public HttpHeaders serialize(@Nullable Object inData, String name, boolean skipValidation, SchemaConfiguration configuration) { - var castInData = skipValidation ? inData : schema.validate(inData, configuration); + public HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) { + var castInData = validate ? schema.validate(inData, configuration) : inData; boolean usedExplode = explode != null && explode; var value = StyleSimpleSerializer.serializeSimple(castInData, name, usedExplode, false); return toHeaders(name, value); } + + private static final Set> VOID_TYPES = Set.of(Void.class); + private static final Set> BOOLEAN_TYPES = Set.of(Boolean.class); + private static final Set> NUMERIC_TYPES = Set.of( + Integer.class, + Long.class, + Float.class, + Double.class + ); + private static final Set> STRING_TYPES = Set.of(String.class); + private static final Set> LIST_TYPES = Set.of(List.class); + private static final Set> MAP_TYPES = Set.of(Map.class); + + private @Nullable Object getCastInData(JsonSchema schema, List inData) { + if (schema.type == null) { + return inData; + } else if (schema.type.size() == 1) { + if (schema.type.equals(BOOLEAN_TYPES)) { + throw new RuntimeException("Boolean serialization is not defined in Rfc6570, there is no agreed upon way to sent a boolean, send a string enum instead"); + } else if (schema.type.equals(VOID_TYPES) && inData.size() == 1 && inData.get(0).isEmpty()) { + return null; + } else if (schema.type.equals(NUMERIC_TYPES) && inData.size() == 1) { + return ContentTypeDeserializer.fromJson(inData.get(0)); + } else if (schema.type.equals(STRING_TYPES) && inData.size() == 1) { + return inData; + } else if (schema.type.equals(LIST_TYPES)) { + Class> itemsSchemaCls = schema.items == null ? UnsetAnyTypeJsonSchema.UnsetAnyTypeJsonSchema1.class : schema.items; + JsonSchema itemSchema = JsonSchemaFactory.getInstance(itemsSchemaCls); + List<@Nullable Object> castList = new ArrayList<>(); + for (String inDataItem: inData) { + @Nullable Object castInDataItem = getCastInData(itemSchema, List.of(inDataItem)); + castList.add(castInDataItem); + } + return castList; + } else if (schema.type.equals(MAP_TYPES)) { + throw new RuntimeException("Header map deserialization has not yet been implemented"); + } + } + throw new RuntimeException("Header deserialization for schemas with multiple types has not yet been implemented"); + } + + @Override + public @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration) { + @Nullable Object castInData = getCastInData(schema, inData); + if (validate) { + return schema.validate(castInData, configuration); + } + return castInData; + } } \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs index 0b3cfa02a47..c6c97c60591 100644 --- a/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs +++ b/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs @@ -14,6 +14,7 @@ import com.google.gson.ToNumberPolicy; import {{{packageName}}}.configurations.SchemaConfiguration; import {{{packageName}}}.schemas.validation.JsonSchema; import {{{packageName}}}.contenttype.ContentTypeDetector; +import {{{packageName}}}.contenttype.ContentTypeDeserializer; import {{{packageName}}}.header.Header; public abstract class ResponseDeserializer { @@ -34,7 +35,7 @@ public abstract class ResponseDeserializer boolHeader.serialize(value, "color", true, configuration) + () -> boolHeader.serialize(value, "color", false, configuration) ); } } From 8b7aec00e5c091ab590bd524e4b8584cd7bc4e6a Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 14:27:14 -0800 Subject: [PATCH 14/32] Adds header deserialization to header docs, deserialization test added --- .../headers/Int32JsonContentTypeHeader.md | 8 ++++- .../docs/components/headers/NumberHeader.md | 8 ++++- .../headers/RefContentSchemaHeader.md | 8 ++++- .../components/headers/RefSchemaHeader.md | 8 ++++- .../docs/components/headers/StringHeader.md | 8 ++++- .../client/header/SchemaHeader.java | 31 ++++++++++------- .../client/header/SchemaHeaderTest.java | 34 +++++++++++++++++++ .../components/headers/HeaderDoc.hbs | 8 ++++- .../java/packagename/header/SchemaHeader.hbs | 31 ++++++++++------- .../packagename/header/SchemaHeaderTest.hbs | 34 +++++++++++++++++++ 10 files changed, 148 insertions(+), 30 deletions(-) diff --git a/samples/client/petstore/java/docs/components/headers/Int32JsonContentTypeHeader.md b/samples/client/petstore/java/docs/components/headers/Int32JsonContentTypeHeader.md index 7ffda102982..17096158e3c 100644 --- a/samples/client/petstore/java/docs/components/headers/Int32JsonContentTypeHeader.md +++ b/samples/client/petstore/java/docs/components/headers/Int32JsonContentTypeHeader.md @@ -32,7 +32,7 @@ class storing schema info for a specific contentType | Void | encoding()
the encoding info | ## Int32JsonContentTypeHeader1 -public static class Int32JsonContentTypeHeader1
+public static class Int32JsonContentTypeHeader1 implements Header
a class that deserializes a header value @@ -50,4 +50,10 @@ a class that deserializes a header value | @Nullable Boolean explode | false | | Map | content = Map.ofEntries(
    new AbstractMap.SimpleEntry<>("application/json", new [ApplicationjsonMediaType](#applicationjsonmediatype)())
)
the contentType to schema info | +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| HttpHeaders | serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) | +| @Nullable Object | deserialize(List inData, boolean validate, SchemaConfiguration configuration)
deserializes the header value | + [[Back to top]](#top) [[Back to Component Headers]](../../../README.md#Component-Headers) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/headers/NumberHeader.md b/samples/client/petstore/java/docs/components/headers/NumberHeader.md index b434092e793..1e5c20621d7 100644 --- a/samples/client/petstore/java/docs/components/headers/NumberHeader.md +++ b/samples/client/petstore/java/docs/components/headers/NumberHeader.md @@ -13,7 +13,7 @@ A class that contains necessary nested header classes ## NumberHeader1 -public static class NumberHeader1
+public static class NumberHeader1 implements Header
a class that deserializes a header value @@ -31,4 +31,10 @@ a class that deserializes a header value | @Nullable Boolean explode | false | | JsonSchema | schema = NumberHeaderSchema.NumberHeaderSchema1.getInstance() +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| HttpHeaders | serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) | +| @Nullable Object | deserialize(List inData, boolean validate, SchemaConfiguration configuration)
deserializes the header value | + [[Back to top]](#top) [[Back to Component Headers]](../../../README.md#Component-Headers) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/headers/RefContentSchemaHeader.md b/samples/client/petstore/java/docs/components/headers/RefContentSchemaHeader.md index 2c1812ead4d..75acdaf5189 100644 --- a/samples/client/petstore/java/docs/components/headers/RefContentSchemaHeader.md +++ b/samples/client/petstore/java/docs/components/headers/RefContentSchemaHeader.md @@ -32,7 +32,7 @@ class storing schema info for a specific contentType | Void | encoding()
the encoding info | ## RefContentSchemaHeader1 -public static class RefContentSchemaHeader1
+public static class RefContentSchemaHeader1 implements Header
a class that deserializes a header value @@ -50,4 +50,10 @@ a class that deserializes a header value | @Nullable Boolean explode | false | | Map | content = Map.ofEntries(
    new AbstractMap.SimpleEntry<>("application/json", new [ApplicationjsonMediaType](#applicationjsonmediatype)())
)
the contentType to schema info | +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| HttpHeaders | serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) | +| @Nullable Object | deserialize(List inData, boolean validate, SchemaConfiguration configuration)
deserializes the header value | + [[Back to top]](#top) [[Back to Component Headers]](../../../README.md#Component-Headers) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/headers/RefSchemaHeader.md b/samples/client/petstore/java/docs/components/headers/RefSchemaHeader.md index 0cc894085f7..01228dd9849 100644 --- a/samples/client/petstore/java/docs/components/headers/RefSchemaHeader.md +++ b/samples/client/petstore/java/docs/components/headers/RefSchemaHeader.md @@ -13,7 +13,7 @@ A class that contains necessary nested header classes ## RefSchemaHeader1 -public static class RefSchemaHeader1
+public static class RefSchemaHeader1 implements Header
a class that deserializes a header value @@ -31,4 +31,10 @@ a class that deserializes a header value | @Nullable Boolean explode | false | | JsonSchema | schema = RefSchemaHeaderSchema.RefSchemaHeaderSchema1.getInstance() +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| HttpHeaders | serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) | +| @Nullable Object | deserialize(List inData, boolean validate, SchemaConfiguration configuration)
deserializes the header value | + [[Back to top]](#top) [[Back to Component Headers]](../../../README.md#Component-Headers) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/docs/components/headers/StringHeader.md b/samples/client/petstore/java/docs/components/headers/StringHeader.md index 77419e9bcbf..bdb458de989 100644 --- a/samples/client/petstore/java/docs/components/headers/StringHeader.md +++ b/samples/client/petstore/java/docs/components/headers/StringHeader.md @@ -13,7 +13,7 @@ A class that contains necessary nested header classes ## StringHeader1 -public static class StringHeader1
+public static class StringHeader1 implements Header
a class that deserializes a header value @@ -31,4 +31,10 @@ a class that deserializes a header value | @Nullable Boolean explode | false | | JsonSchema | schema = StringHeaderSchema.StringHeaderSchema1.getInstance() +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| HttpHeaders | serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) | +| @Nullable Object | deserialize(List inData, boolean validate, SchemaConfiguration configuration)
deserializes the header value | + [[Back to top]](#top) [[Back to Component Headers]](../../../README.md#Component-Headers) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java index e2bfce785cd..c1ac0bfba37 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java @@ -49,30 +49,37 @@ public HttpHeaders serialize(@Nullable Object inData, String name, boolean valid private static final Set> LIST_TYPES = Set.of(List.class); private static final Set> MAP_TYPES = Set.of(Map.class); + private List<@Nullable Object> getList(JsonSchema schema, List inData) { + Class> itemsSchemaCls = schema.items == null ? UnsetAnyTypeJsonSchema.UnsetAnyTypeJsonSchema1.class : schema.items; + JsonSchema itemSchema = JsonSchemaFactory.getInstance(itemsSchemaCls); + List<@Nullable Object> castList = new ArrayList<>(); + for (String inDataItem: inData) { + @Nullable Object castInDataItem = getCastInData(itemSchema, List.of(inDataItem)); + castList.add(castInDataItem); + } + return castList; + } + private @Nullable Object getCastInData(JsonSchema schema, List inData) { if (schema.type == null) { - return inData; + if (inData.size() == 1) { + return inData.get(0); + } + return getList(schema, inData); } else if (schema.type.size() == 1) { if (schema.type.equals(BOOLEAN_TYPES)) { throw new RuntimeException("Boolean serialization is not defined in Rfc6570, there is no agreed upon way to sent a boolean, send a string enum instead"); } else if (schema.type.equals(VOID_TYPES) && inData.size() == 1 && inData.get(0).isEmpty()) { return null; - } else if (schema.type.equals(NUMERIC_TYPES) && inData.size() == 1) { - return ContentTypeDeserializer.fromJson(inData.get(0)); } else if (schema.type.equals(STRING_TYPES) && inData.size() == 1) { - return inData; + return inData.get(0); } else if (schema.type.equals(LIST_TYPES)) { - Class> itemsSchemaCls = schema.items == null ? UnsetAnyTypeJsonSchema.UnsetAnyTypeJsonSchema1.class : schema.items; - JsonSchema itemSchema = JsonSchemaFactory.getInstance(itemsSchemaCls); - List<@Nullable Object> castList = new ArrayList<>(); - for (String inDataItem: inData) { - @Nullable Object castInDataItem = getCastInData(itemSchema, List.of(inDataItem)); - castList.add(castInDataItem); - } - return castList; + return getList(schema, inData); } else if (schema.type.equals(MAP_TYPES)) { throw new RuntimeException("Header map deserialization has not yet been implemented"); } + } else if (schema.type.size() == 4 && schema.type.equals(NUMERIC_TYPES) && inData.size() == 1) { + return ContentTypeDeserializer.fromJson(inData.get(0)); } throw new RuntimeException("Header deserialization for schemas with multiple types has not yet been implemented"); } diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java index 5c6ef552e1c..3ae7b9fe4a6 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java @@ -7,6 +7,11 @@ import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.exceptions.InvalidTypeException; import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.ListJsonSchema; +import org.openapijsonschematools.client.schemas.NullJsonSchema; +import org.openapijsonschematools.client.schemas.NumberJsonSchema; +import org.openapijsonschematools.client.schemas.StringJsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; import java.net.http.HttpHeaders; import java.util.LinkedHashMap; @@ -105,4 +110,33 @@ public void testSerialization() { ); } } + + @Test + public void testDeserialization() { + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + + SchemaHeader header = getHeader(NullJsonSchema.NullJsonSchema1.getInstance()); + var deserialized = header.deserialize(List.of(""), false, configuration); + Assert.assertEquals(deserialized, null); + + header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("1"), false, configuration); + Assert.assertEquals(deserialized, 1L); + + header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("3.14"), false, configuration); + Assert.assertEquals(deserialized, 3.14d); + + header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("blue"), false, configuration); + Assert.assertEquals(deserialized, "blue"); + + header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("hello world"), false, configuration); + Assert.assertEquals(deserialized, "hello world"); + + header = getHeader(ListJsonSchema.ListJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("blue", "black", "brown"), false, configuration); + Assert.assertEquals(deserialized, List.of("blue", "black", "brown")); + } } diff --git a/src/main/resources/java/src/main/java/packagename/components/headers/HeaderDoc.hbs b/src/main/resources/java/src/main/java/packagename/components/headers/HeaderDoc.hbs index 2b085caf265..f61189235ba 100644 --- a/src/main/resources/java/src/main/java/packagename/components/headers/HeaderDoc.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/headers/HeaderDoc.hbs @@ -62,7 +62,7 @@ class storing schema info for a specific contentType {{/each}} {{> src/main/java/packagename/components/_helper_header_from_identifier_pieces headerSize=(join headerSize "#" "") identifierPieces=(append identifierPieces (join jsonPathPiece.pascalCase "1" "")) }} -public static class {{jsonPathPiece.pascalCase}}1
+public static class {{jsonPathPiece.pascalCase}}1 implements Header
a class that deserializes a header value @@ -83,6 +83,12 @@ a class that deserializes a header value {{else}} | JsonSchema | schema = {{#with schema}}{{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}.getInstance(){{/with}} {{/if}} + +{{headerSize}}## Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| HttpHeaders | serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) | +| @Nullable Object | deserialize(List inData, boolean validate, SchemaConfiguration configuration)
deserializes the header value | {{/if}} {{#if componentModule}} diff --git a/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs b/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs index 83c035183bb..c3be42398e3 100644 --- a/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs +++ b/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs @@ -49,30 +49,37 @@ public class SchemaHeader extends HeaderBase implements Header { private static final Set> LIST_TYPES = Set.of(List.class); private static final Set> MAP_TYPES = Set.of(Map.class); + private List<@Nullable Object> getList(JsonSchema schema, List inData) { + Class> itemsSchemaCls = schema.items == null ? UnsetAnyTypeJsonSchema.UnsetAnyTypeJsonSchema1.class : schema.items; + JsonSchema itemSchema = JsonSchemaFactory.getInstance(itemsSchemaCls); + List<@Nullable Object> castList = new ArrayList<>(); + for (String inDataItem: inData) { + @Nullable Object castInDataItem = getCastInData(itemSchema, List.of(inDataItem)); + castList.add(castInDataItem); + } + return castList; + } + private @Nullable Object getCastInData(JsonSchema schema, List inData) { if (schema.type == null) { - return inData; + if (inData.size() == 1) { + return inData.get(0); + } + return getList(schema, inData); } else if (schema.type.size() == 1) { if (schema.type.equals(BOOLEAN_TYPES)) { throw new RuntimeException("Boolean serialization is not defined in Rfc6570, there is no agreed upon way to sent a boolean, send a string enum instead"); } else if (schema.type.equals(VOID_TYPES) && inData.size() == 1 && inData.get(0).isEmpty()) { return null; - } else if (schema.type.equals(NUMERIC_TYPES) && inData.size() == 1) { - return ContentTypeDeserializer.fromJson(inData.get(0)); } else if (schema.type.equals(STRING_TYPES) && inData.size() == 1) { - return inData; + return inData.get(0); } else if (schema.type.equals(LIST_TYPES)) { - Class> itemsSchemaCls = schema.items == null ? UnsetAnyTypeJsonSchema.UnsetAnyTypeJsonSchema1.class : schema.items; - JsonSchema itemSchema = JsonSchemaFactory.getInstance(itemsSchemaCls); - List<@Nullable Object> castList = new ArrayList<>(); - for (String inDataItem: inData) { - @Nullable Object castInDataItem = getCastInData(itemSchema, List.of(inDataItem)); - castList.add(castInDataItem); - } - return castList; + return getList(schema, inData); } else if (schema.type.equals(MAP_TYPES)) { throw new RuntimeException("Header map deserialization has not yet been implemented"); } + } else if (schema.type.size() == 4 && schema.type.equals(NUMERIC_TYPES) && inData.size() == 1) { + return ContentTypeDeserializer.fromJson(inData.get(0)); } throw new RuntimeException("Header deserialization for schemas with multiple types has not yet been implemented"); } diff --git a/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs b/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs index 7d91dd91418..fbd20feee67 100644 --- a/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs +++ b/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs @@ -7,6 +7,11 @@ import {{{packageName}}}.configurations.JsonSchemaKeywordFlags; import {{{packageName}}}.configurations.SchemaConfiguration; import {{{packageName}}}.exceptions.InvalidTypeException; import {{{packageName}}}.schemas.AnyTypeJsonSchema; +import {{{packageName}}}.schemas.ListJsonSchema; +import {{{packageName}}}.schemas.NullJsonSchema; +import {{{packageName}}}.schemas.NumberJsonSchema; +import {{{packageName}}}.schemas.StringJsonSchema; +import {{{packageName}}}.schemas.validation.JsonSchema; import java.net.http.HttpHeaders; import java.util.LinkedHashMap; @@ -105,4 +110,33 @@ public class SchemaHeaderTest { ); } } + + @Test + public void testDeserialization() { + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + + SchemaHeader header = getHeader(NullJsonSchema.NullJsonSchema1.getInstance()); + var deserialized = header.deserialize(List.of(""), false, configuration); + Assert.assertEquals(deserialized, null); + + header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("1"), false, configuration); + Assert.assertEquals(deserialized, 1L); + + header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("3.14"), false, configuration); + Assert.assertEquals(deserialized, 3.14d); + + header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("blue"), false, configuration); + Assert.assertEquals(deserialized, "blue"); + + header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("hello world"), false, configuration); + Assert.assertEquals(deserialized, "hello world"); + + header = getHeader(ListJsonSchema.ListJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("blue", "black", "brown"), false, configuration); + Assert.assertEquals(deserialized, List.of("blue", "black", "brown")); + } } From 89929af9f63b40a319cfdba83ff95aae91fd0884 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 14:29:22 -0800 Subject: [PATCH 15/32] Adds missing test helper --- .../client/header/SchemaHeaderTest.java | 9 +++++++++ .../test/java/packagename/header/SchemaHeaderTest.hbs | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java index 3ae7b9fe4a6..334497d9059 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java @@ -111,6 +111,15 @@ public void testSerialization() { } } + private static SchemaHeader getHeader(JsonSchema schema) { + return new SchemaHeader( + true, + false, + false, + schema + ); + } + @Test public void testDeserialization() { SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); diff --git a/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs b/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs index fbd20feee67..ceb9119f6e0 100644 --- a/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs +++ b/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs @@ -111,6 +111,15 @@ public class SchemaHeaderTest { } } + private static SchemaHeader getHeader(JsonSchema schema) { + return new SchemaHeader( + true, + false, + false, + schema + ); + } + @Test public void testDeserialization() { SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); From ac2b076ac333bb6542777d0490a669956311852e Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 14:52:07 -0800 Subject: [PATCH 16/32] Adds HeadersDeserializer class --- .../client/response/HeadersDeserializer.java | 34 +++++++++++++++++++ .../generators/JavaClientGenerator.java | 4 +++ .../response/HeadersDeserializer.hbs | 34 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java create mode 100644 src/main/resources/java/src/main/java/packagename/response/HeadersDeserializer.hbs diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java new file mode 100644 index 00000000000..84193108bc1 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java @@ -0,0 +1,34 @@ +package org.openapijsonschematools.client.response; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.header.Header; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; + +import java.net.http.HttpHeaders; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class HeadersDeserializer { + private final Map headers; + final private MapSchemaValidator headersSchema; + public HeadersDeserializer(Map headers, MapSchemaValidator headersSchema) { + this.headers = headers; + this.headersSchema = headersSchema; + } + + public OutType deserialize(HttpHeaders responseHeaders, SchemaConfiguration configuration) { + Map headersToValidate = new HashMap<>(); + for (Map.Entry> entry: responseHeaders.map().entrySet()) { + String headerName = entry.getKey(); + Header headerDeserializer = headers.get(headerName); + if (headerDeserializer == null) { + continue; + } + @Nullable Object headerValue = headerDeserializer.deserialize(entry.getValue(), false, configuration); + headersToValidate.put(headerName, headerValue); + } + return headersSchema.validate(headersToValidate, configuration); + } +} diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index faaad7d259b..1482ec67e0a 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -838,6 +838,10 @@ public void processOpts() { "src/main/java/packagename/response/DeserializedHttpResponse.hbs", packagePath() + File.separatorChar + "response", "DeserializedHttpResponse.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/response/HeadersDeserializer.hbs", + packagePath() + File.separatorChar + "response", + "HeadersDeserializer.java")); supportingFiles.add(new SupportingFile( "src/main/java/packagename/response/ResponseDeserializer.hbs", packagePath() + File.separatorChar + "response", diff --git a/src/main/resources/java/src/main/java/packagename/response/HeadersDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/response/HeadersDeserializer.hbs new file mode 100644 index 00000000000..c7880fa57aa --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/response/HeadersDeserializer.hbs @@ -0,0 +1,34 @@ +package {{{packageName}}}.response; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.configurations.SchemaConfiguration; +import {{{packageName}}}.header.Header; +import {{{packageName}}}.schemas.validation.MapSchemaValidator; + +import java.net.http.HttpHeaders; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class HeadersDeserializer { + private final Map headers; + final private MapSchemaValidator headersSchema; + public HeadersDeserializer(Map headers, MapSchemaValidator headersSchema) { + this.headers = headers; + this.headersSchema = headersSchema; + } + + public OutType deserialize(HttpHeaders responseHeaders, SchemaConfiguration configuration) { + Map headersToValidate = new HashMap<>(); + for (Map.Entry> entry: responseHeaders.map().entrySet()) { + String headerName = entry.getKey(); + Header headerDeserializer = headers.get(headerName); + if (headerDeserializer == null) { + continue; + } + @Nullable Object headerValue = headerDeserializer.deserialize(entry.getValue(), false, configuration); + headersToValidate.put(headerName, headerValue); + } + return headersSchema.validate(headersToValidate, configuration); + } +} From b5ed046f81f64de042a9aa705f1dc59d64c291b3 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 15:43:47 -0800 Subject: [PATCH 17/32] Generates headers deserializer files --- .../client/petstore/java/.openapi-generator/FILES | 5 +++++ .../generatorrunner/DefaultGeneratorRunner.java | 7 +++++-- .../codegen/generators/DefaultGenerator.java | 10 +++++++--- .../codegen/generators/JavaClientGenerator.java | 9 +++++++++ .../generators/openapimodels/CodegenResponse.java | 4 ++-- .../components/responses/HeadersDeserializer.hbs | 12 ++++++++++++ 6 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/java/src/main/java/packagename/components/responses/HeadersDeserializer.hbs diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 2899cffa735..367b7b96bc6 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -360,16 +360,19 @@ src/main/java/org/openapijsonschematools/client/components/responses/SuccessInli src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java src/main/java/org/openapijsonschematools/client/components/responses/SuccessfulXmlAndJsonArrayOfPet.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java +src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/Location.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/location/LocationSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successfulxmlandjsonarrayofpet/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successfulxmlandjsonarrayofpet/content/applicationxml/ApplicationxmlSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/content/applicationjson/ApplicationjsonSchema.java +src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/SomeHeader.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/someheader/SomeHeaderSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/content/applicationjson/ApplicationjsonSchema.java +src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Int32.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refcontentschemaheader.java @@ -949,6 +952,7 @@ src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Co src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/content/applicationxml/ApplicationxmlSchema.java +src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Int32.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Refcontentschemaheader.java @@ -980,6 +984,7 @@ src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerialize src/main/java/org/openapijsonschematools/client/requestbody/SerializedRequestBody.java src/main/java/org/openapijsonschematools/client/response/ApiResponse.java src/main/java/org/openapijsonschematools/client/response/DeserializedHttpResponse.java +src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java src/main/java/org/openapijsonschematools/client/response/ResponsesDeserializer.java src/main/java/org/openapijsonschematools/client/schemas/AnyTypeJsonSchema.java diff --git a/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java b/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java index bae4daee7d1..e5c76c2c851 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java +++ b/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java @@ -650,7 +650,10 @@ private void generateResponse(List files, CodegenResponse response, String // headers if (response.headers != null && !response.headers.isEmpty()) { String headersJsonPath = jsonPath + "/headers"; - generateXs(files, headersJsonPath, CodegenConstants.JSON_PATH_LOCATION_TYPE.HEADERS, CodegenConstants.HEADERS, null, true); + Map headersInfo = new HashMap<>(); + headersInfo.put("headers", response.headers); + headersInfo.put("headersObjectSchema", response.headersObjectSchema); + generateXs(files, headersJsonPath, CodegenConstants.JSON_PATH_LOCATION_TYPE.HEADERS, CodegenConstants.HEADERS, null, generator.shouldGenerateFile(headersJsonPath)); for (Map.Entry headerInfo: response.headers.entrySet()) { String headerName = headerInfo.getKey(); CodegenHeader header = headerInfo.getValue(); @@ -983,7 +986,7 @@ private TreeMap generateHeaders(List files) { } TreeMap headers = new TreeMap<>(); String headersJsonPath = "#/components/headers"; - generateXs(files, headersJsonPath, CodegenConstants.JSON_PATH_LOCATION_TYPE.HEADERS, CodegenConstants.HEADERS, null, true); + generateXs(files, headersJsonPath, CodegenConstants.JSON_PATH_LOCATION_TYPE.HEADERS, CodegenConstants.HEADERS, null, generator.shouldGenerateFile(headersJsonPath)); for (Map.Entry entry: specHeaders.entrySet()) { String componentName = entry.getKey(); Header specHeader = entry.getValue(); diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java index 0a5bc4b7a77..fa68b6f1aa2 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java @@ -3070,17 +3070,17 @@ public CodegenResponse fromResponse(ApiResponse response, String sourceJsonPath) } Map responseHeaders = response.getHeaders(); - Map headers = null; + CodegenMap headers = null; HashMap headersProperties = new HashMap<>(); List headersRequired = new ArrayList<>(); if (responseHeaders != null && !responseHeaders.isEmpty()) { - headers = new HashMap<>(); + var headersMap = new HashMap(); for (Entry entry : responseHeaders.entrySet()) { String headerName = entry.getKey(); Header header = entry.getValue(); String headerSourceJsonPath = sourceJsonPath + "/headers/" + headerName; CodegenHeader responseHeader = fromHeader(header, headerSourceJsonPath); - headers.put(headerName, responseHeader); + headersMap.put(headerName, responseHeader); CodegenHeader derefParam = responseHeader.getSelfOrDeepestRef(); if (Boolean.TRUE.equals(derefParam.required)) { headersRequired.add(headerName); @@ -3090,6 +3090,10 @@ public CodegenResponse fromResponse(ApiResponse response, String sourceJsonPath) parameterSchema.set$ref(schemaJsonPath); headersProperties.put(headerName, parameterSchema); } + String headersJsonPath = sourceJsonPath + "/headers"; + CodegenKey headersJsonPathPiece = getKey("headers", "headers", headersJsonPath); + String subpackage = getSubpackage(headersJsonPath); + headers = new CodegenMap<>(headersMap, headersJsonPathPiece, subpackage); } LinkedHashMap content = getContent(response.getContent(), sourceJsonPath + "/content"); String expectedComponentType = "responses"; diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 1482ec67e0a..314f0026197 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -901,6 +901,12 @@ public void processOpts() { put("src/main/java/packagename/components/responses/ResponseDoc.hbs", ".md"); }} ); + jsonPathTemplateFiles.put( + CodegenConstants.JSON_PATH_LOCATION_TYPE.HEADERS, + new HashMap<>() {{ + put("src/main/java/packagename/components/responses/HeadersDeserializer.hbs", ".java"); + }} + ); // schema HashMap schemaTemplates = new HashMap<>(); @@ -3141,6 +3147,9 @@ public boolean shouldGenerateFile(String jsonPath) { if (jsonPath.equals("#/components/responses")) { return false; } + if (jsonPath.equals("#/components/headers")) { + return false; + } return true; } } diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenResponse.java b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenResponse.java index cd248827c90..b57981a7314 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenResponse.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenResponse.java @@ -21,7 +21,7 @@ public class CodegenResponse { public final CodegenText description; - public final Map headers; + public final CodegenMap headers; public final CodegenSchema headersObjectSchema; public final LinkedHashMap content; public final CodegenRefInfo refInfo; @@ -44,7 +44,7 @@ public CodegenResponse getSelfOrDeepestRef() { return refObject; } - public CodegenResponse(CodegenKey jsonPathPiece, Map headers, CodegenSchema headersObjectSchema, CodegenText description, Map vendorExtensions, LinkedHashMap content, CodegenRefInfo refInfo, TreeSet imports, boolean componentModule, String pathFromDocRoot, String subpackage) { + public CodegenResponse(CodegenKey jsonPathPiece, CodegenMap headers, CodegenSchema headersObjectSchema, CodegenText description, Map vendorExtensions, LinkedHashMap content, CodegenRefInfo refInfo, TreeSet imports, boolean componentModule, String pathFromDocRoot, String subpackage) { this.jsonPathPiece = jsonPathPiece; this.headers = headers; this.headersObjectSchema = headersObjectSchema; diff --git a/src/main/resources/java/src/main/java/packagename/components/responses/HeadersDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/components/responses/HeadersDeserializer.hbs new file mode 100644 index 00000000000..9d2943e100b --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/components/responses/HeadersDeserializer.hbs @@ -0,0 +1,12 @@ +package {{packageName}}.{{headers.subpackage}}; + +import {{packageName}}.response.HeadersDeserializer; +{{#each headers}} +import {{packageName}}.{{subpackage}}; +{{/each}} +{{#with headersObjectSchema}} +import {{packageName}}.{{subpackage}}; +{{/with}} + +public class {{headers.jsonPathPiece.pascalCase}} extends HeadersDeserializer { +} \ No newline at end of file From e008bf0a35dcb3dd2eaffce754331d51ff7bf1ef Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 17:44:56 -0800 Subject: [PATCH 18/32] Fixes package name for headers --- .../petstore/java/.openapi-generator/FILES | 8 +- .../responses/headerswithnobody/Headers.java | 200 +------ .../headerswithnobody/HeadersSchema.java | 192 ++++++ .../Headers.java | 200 +------ .../HeadersSchema.java | 192 ++++++ .../successwithjsonapiresponse/Headers.java | 545 +----------------- .../HeadersSchema.java | 529 +++++++++++++++++ .../responses/code200response/Headers.java | 406 +------------ .../code200response/HeadersSchema.java | 390 +++++++++++++ .../DefaultGeneratorRunner.java | 5 +- .../codegen/generators/DefaultGenerator.java | 9 +- .../generators/JavaClientGenerator.java | 11 +- .../responses/HeadersDeserializer.hbs | 20 +- 13 files changed, 1408 insertions(+), 1299 deletions(-) create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersSchema.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/HeadersSchema.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/HeadersSchema.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/HeadersSchema.java diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 367b7b96bc6..752c99f548c 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -359,18 +359,18 @@ src/main/java/org/openapijsonschematools/client/components/responses/SuccessDesc src/main/java/org/openapijsonschematools/client/components/responses/SuccessInlineContentAndHeader.java src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java src/main/java/org/openapijsonschematools/client/components/responses/SuccessfulXmlAndJsonArrayOfPet.java -src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java +src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersSchema.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/Location.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/location/LocationSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successfulxmlandjsonarrayofpet/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successfulxmlandjsonarrayofpet/content/applicationxml/ApplicationxmlSchema.java -src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java +src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/HeadersSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/SomeHeader.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/someheader/SomeHeaderSchema.java -src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java +src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/HeadersSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Int32.java @@ -949,7 +949,7 @@ src/main/java/org/openapijsonschematools/client/paths/userlogin/get/parameters/p src/main/java/org/openapijsonschematools/client/paths/userlogin/get/parameters/parameter1/Schema1.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code400Response.java -src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java +src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/HeadersSchema.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/content/applicationxml/ApplicationxmlSchema.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java index 5a4894c3c3a..d3b7461f1ce 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java @@ -1,192 +1,18 @@ package org.openapijsonschematools.client.components.responses.headerswithnobody; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; + +import org.openapijsonschematools.client.response.HeadersDeserializer; +import org.openapijsonschematools.client.components.responses.headerswithnobody.headers.Location; + import java.util.Map; -import java.util.Objects; -import java.util.Set; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.components.responses.headerswithnobody.headers.location.LocationSchema; -import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; -import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.exceptions.InvalidTypeException; -import org.openapijsonschematools.client.exceptions.UnsetPropertyException; -import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; -import org.openapijsonschematools.client.schemas.GenericBuilder; -import org.openapijsonschematools.client.schemas.NotAnyTypeJsonSchema; -import org.openapijsonschematools.client.schemas.validation.FrozenMap; -import org.openapijsonschematools.client.schemas.validation.JsonSchema; -import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; -import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; -import org.openapijsonschematools.client.schemas.validation.MapUtils; -import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; -import org.openapijsonschematools.client.schemas.validation.PropertyEntry; -import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; +import java.util.AbstractMap; -public class Headers { - // nest classes so all schemas and input/output classes can be public - - - public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { - // NotAnyTypeSchema - private static @Nullable AdditionalProperties instance = null; - public static AdditionalProperties getInstance() { - if (instance == null) { - instance = new AdditionalProperties(); - } - return instance; - } - } - - - public static class HeadersMap extends FrozenMap { - protected HeadersMap(FrozenMap m) { - super(m); - } - public static final Set requiredKeys = Set.of(); - public static final Set optionalKeys = Set.of( - "location" - ); - public static HeadersMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { - return Headers1.getInstance().validate(arg, configuration); - } - - public String location() throws UnsetPropertyException { - return getOrThrow("location"); - } - } - - public interface SetterForLocation { - Map getInstance(); - T getBuilderAfterLocation(Map instance); - - default T location(String value) { - var instance = getInstance(); - instance.put("location", value); - return getBuilderAfterLocation(instance); - } - } - - public static class HeadersMapBuilder implements GenericBuilder>, SetterForLocation { - private final Map instance; - private static final Set knownKeys = Set.of( - "location" +public class Headers extends HeadersDeserializer { + public Headers() { + super( + Map.ofEntries( + new AbstractMap.SimpleEntry<>("location", new Location.Location1()) + ), + HeadersSchema.HeadersSchema1.getInstance() ); - public Set getKnownKeys() { - return knownKeys; - } - public HeadersMapBuilder() { - this.instance = new LinkedHashMap<>(); - } - public Map build() { - return instance; - } - public Map getInstance() { - return instance; - } - public HeadersMapBuilder getBuilderAfterLocation(Map instance) { - return this; - } - } - - - public sealed interface Headers1Boxed permits Headers1BoxedMap { - @Nullable Object getData(); - } - - public record Headers1BoxedMap(HeadersMap data) implements Headers1Boxed { - @Override - public @Nullable Object getData() { - return data; - } } - - - public static class Headers1 extends JsonSchema implements MapSchemaValidator { - private static @Nullable Headers1 instance = null; - - protected Headers1() { - super(new JsonSchemaInfo() - .type(Set.of(Map.class)) - .properties(Map.ofEntries( - new PropertyEntry("location", LocationSchema.LocationSchema1.class) - )) - .additionalProperties(AdditionalProperties.class) - ); - } - - public static Headers1 getInstance() { - if (instance == null) { - instance = new Headers1(); - } - return instance; - } - - public HeadersMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { - LinkedHashMap properties = new LinkedHashMap<>(); - for(Map.Entry entry: arg.entrySet()) { - @Nullable Object entryKey = entry.getKey(); - if (!(entryKey instanceof String)) { - throw new InvalidTypeException("Invalid non-string key value"); - } - String propertyName = (String) entryKey; - List propertyPathToItem = new ArrayList<>(pathToItem); - propertyPathToItem.add(propertyName); - Object value = entry.getValue(); - LinkedHashMap, Void> schemas = pathToSchemas.get(propertyPathToItem); - if (schemas == null) { - throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); - } - JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); - @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); - if (!(propertyInstance instanceof String)) { - throw new InvalidTypeException("Invalid instantiated value"); - } - properties.put(propertyName, (String) propertyInstance); - } - FrozenMap castProperties = new FrozenMap<>(properties); - return new HeadersMap(castProperties); - } - - public HeadersMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - Set> pathSet = new HashSet<>(); - List pathToItem = List.of("args[0"); - Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); - SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); - ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); - PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); - return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); - } - - - @Override - public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - if (arg instanceof Map) { - return validate((Map) arg, configuration); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); - } - @Override - public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { - if (arg instanceof Map) { - return getNewInstance((Map) arg, pathToItem, pathToSchemas); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); - } - @Override - public Headers1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - return new Headers1BoxedMap(validate(arg, configuration)); - } - @Override - public Headers1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - if (arg instanceof Map castArg) { - return validateAndBox(castArg, configuration); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); - } - } - -} +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersSchema.java new file mode 100644 index 00000000000..029c2445e6c --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersSchema.java @@ -0,0 +1,192 @@ +package org.openapijsonschematools.client.components.responses.headerswithnobody; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.components.responses.headerswithnobody.headers.location.LocationSchema; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.GenericBuilder; +import org.openapijsonschematools.client.schemas.NotAnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.validation.FrozenMap; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; +import org.openapijsonschematools.client.schemas.validation.PropertyEntry; +import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; + +public class HeadersSchema { + // nest classes so all schemas and input/output classes can be public + + + public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { + // NotAnyTypeSchema + private static @Nullable AdditionalProperties instance = null; + public static AdditionalProperties getInstance() { + if (instance == null) { + instance = new AdditionalProperties(); + } + return instance; + } + } + + + public static class HeadersSchemaMap extends FrozenMap { + protected HeadersSchemaMap(FrozenMap m) { + super(m); + } + public static final Set requiredKeys = Set.of(); + public static final Set optionalKeys = Set.of( + "location" + ); + public static HeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return HeadersSchema1.getInstance().validate(arg, configuration); + } + + public String location() throws UnsetPropertyException { + return getOrThrow("location"); + } + } + + public interface SetterForLocation { + Map getInstance(); + T getBuilderAfterLocation(Map instance); + + default T location(String value) { + var instance = getInstance(); + instance.put("location", value); + return getBuilderAfterLocation(instance); + } + } + + public static class HeadersSchemaMapBuilder implements GenericBuilder>, SetterForLocation { + private final Map instance; + private static final Set knownKeys = Set.of( + "location" + ); + public Set getKnownKeys() { + return knownKeys; + } + public HeadersSchemaMapBuilder() { + this.instance = new LinkedHashMap<>(); + } + public Map build() { + return instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMapBuilder getBuilderAfterLocation(Map instance) { + return this; + } + } + + + public sealed interface HeadersSchema1Boxed permits HeadersSchema1BoxedMap { + @Nullable Object getData(); + } + + public record HeadersSchema1BoxedMap(HeadersSchemaMap data) implements HeadersSchema1Boxed { + @Override + public @Nullable Object getData() { + return data; + } + } + + + public static class HeadersSchema1 extends JsonSchema implements MapSchemaValidator { + private static @Nullable HeadersSchema1 instance = null; + + protected HeadersSchema1() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("location", LocationSchema.LocationSchema1.class) + )) + .additionalProperties(AdditionalProperties.class) + ); + } + + public static HeadersSchema1 getInstance() { + if (instance == null) { + instance = new HeadersSchema1(); + } + return instance; + } + + public HeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + LinkedHashMap properties = new LinkedHashMap<>(); + for(Map.Entry entry: arg.entrySet()) { + @Nullable Object entryKey = entry.getKey(); + if (!(entryKey instanceof String)) { + throw new InvalidTypeException("Invalid non-string key value"); + } + String propertyName = (String) entryKey; + List propertyPathToItem = new ArrayList<>(pathToItem); + propertyPathToItem.add(propertyName); + Object value = entry.getValue(); + LinkedHashMap, Void> schemas = pathToSchemas.get(propertyPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); + if (!(propertyInstance instanceof String)) { + throw new InvalidTypeException("Invalid instantiated value"); + } + properties.put(propertyName, (String) propertyInstance); + } + FrozenMap castProperties = new FrozenMap<>(properties); + return new HeadersSchemaMap(castProperties); + } + + public HeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof Map) { + return validate((Map) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg instanceof Map) { + return getNewInstance((Map) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + @Override + public HeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + return new HeadersSchema1BoxedMap(validate(arg, configuration)); + } + @Override + public HeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof Map castArg) { + return validateAndBox(castArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java index 209447c856e..209ab12a240 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java @@ -1,192 +1,18 @@ package org.openapijsonschematools.client.components.responses.successinlinecontentandheader; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; + +import org.openapijsonschematools.client.response.HeadersDeserializer; +import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.headers.SomeHeader; + import java.util.Map; -import java.util.Objects; -import java.util.Set; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.headers.someheader.SomeHeaderSchema; -import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; -import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.exceptions.InvalidTypeException; -import org.openapijsonschematools.client.exceptions.UnsetPropertyException; -import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; -import org.openapijsonschematools.client.schemas.GenericBuilder; -import org.openapijsonschematools.client.schemas.NotAnyTypeJsonSchema; -import org.openapijsonschematools.client.schemas.validation.FrozenMap; -import org.openapijsonschematools.client.schemas.validation.JsonSchema; -import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; -import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; -import org.openapijsonschematools.client.schemas.validation.MapUtils; -import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; -import org.openapijsonschematools.client.schemas.validation.PropertyEntry; -import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; +import java.util.AbstractMap; -public class Headers { - // nest classes so all schemas and input/output classes can be public - - - public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { - // NotAnyTypeSchema - private static @Nullable AdditionalProperties instance = null; - public static AdditionalProperties getInstance() { - if (instance == null) { - instance = new AdditionalProperties(); - } - return instance; - } - } - - - public static class HeadersMap extends FrozenMap { - protected HeadersMap(FrozenMap m) { - super(m); - } - public static final Set requiredKeys = Set.of(); - public static final Set optionalKeys = Set.of( - "someHeader" - ); - public static HeadersMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { - return Headers1.getInstance().validate(arg, configuration); - } - - public String someHeader() throws UnsetPropertyException { - return getOrThrow("someHeader"); - } - } - - public interface SetterForSomeHeader { - Map getInstance(); - T getBuilderAfterSomeHeader(Map instance); - - default T someHeader(String value) { - var instance = getInstance(); - instance.put("someHeader", value); - return getBuilderAfterSomeHeader(instance); - } - } - - public static class HeadersMapBuilder implements GenericBuilder>, SetterForSomeHeader { - private final Map instance; - private static final Set knownKeys = Set.of( - "someHeader" +public class Headers extends HeadersDeserializer { + public Headers() { + super( + Map.ofEntries( + new AbstractMap.SimpleEntry<>("someHeader", new SomeHeader.SomeHeader1()) + ), + HeadersSchema.HeadersSchema1.getInstance() ); - public Set getKnownKeys() { - return knownKeys; - } - public HeadersMapBuilder() { - this.instance = new LinkedHashMap<>(); - } - public Map build() { - return instance; - } - public Map getInstance() { - return instance; - } - public HeadersMapBuilder getBuilderAfterSomeHeader(Map instance) { - return this; - } - } - - - public sealed interface Headers1Boxed permits Headers1BoxedMap { - @Nullable Object getData(); - } - - public record Headers1BoxedMap(HeadersMap data) implements Headers1Boxed { - @Override - public @Nullable Object getData() { - return data; - } } - - - public static class Headers1 extends JsonSchema implements MapSchemaValidator { - private static @Nullable Headers1 instance = null; - - protected Headers1() { - super(new JsonSchemaInfo() - .type(Set.of(Map.class)) - .properties(Map.ofEntries( - new PropertyEntry("someHeader", SomeHeaderSchema.SomeHeaderSchema1.class) - )) - .additionalProperties(AdditionalProperties.class) - ); - } - - public static Headers1 getInstance() { - if (instance == null) { - instance = new Headers1(); - } - return instance; - } - - public HeadersMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { - LinkedHashMap properties = new LinkedHashMap<>(); - for(Map.Entry entry: arg.entrySet()) { - @Nullable Object entryKey = entry.getKey(); - if (!(entryKey instanceof String)) { - throw new InvalidTypeException("Invalid non-string key value"); - } - String propertyName = (String) entryKey; - List propertyPathToItem = new ArrayList<>(pathToItem); - propertyPathToItem.add(propertyName); - Object value = entry.getValue(); - LinkedHashMap, Void> schemas = pathToSchemas.get(propertyPathToItem); - if (schemas == null) { - throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); - } - JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); - @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); - if (!(propertyInstance instanceof String)) { - throw new InvalidTypeException("Invalid instantiated value"); - } - properties.put(propertyName, (String) propertyInstance); - } - FrozenMap castProperties = new FrozenMap<>(properties); - return new HeadersMap(castProperties); - } - - public HeadersMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - Set> pathSet = new HashSet<>(); - List pathToItem = List.of("args[0"); - Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); - SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); - ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); - PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); - return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); - } - - - @Override - public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - if (arg instanceof Map) { - return validate((Map) arg, configuration); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); - } - @Override - public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { - if (arg instanceof Map) { - return getNewInstance((Map) arg, pathToItem, pathToSchemas); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); - } - @Override - public Headers1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - return new Headers1BoxedMap(validate(arg, configuration)); - } - @Override - public Headers1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - if (arg instanceof Map castArg) { - return validateAndBox(castArg, configuration); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); - } - } - -} +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/HeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/HeadersSchema.java new file mode 100644 index 00000000000..5c0f23a75b1 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/HeadersSchema.java @@ -0,0 +1,192 @@ +package org.openapijsonschematools.client.components.responses.successinlinecontentandheader; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.headers.someheader.SomeHeaderSchema; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.GenericBuilder; +import org.openapijsonschematools.client.schemas.NotAnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.validation.FrozenMap; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; +import org.openapijsonschematools.client.schemas.validation.PropertyEntry; +import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; + +public class HeadersSchema { + // nest classes so all schemas and input/output classes can be public + + + public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { + // NotAnyTypeSchema + private static @Nullable AdditionalProperties instance = null; + public static AdditionalProperties getInstance() { + if (instance == null) { + instance = new AdditionalProperties(); + } + return instance; + } + } + + + public static class HeadersSchemaMap extends FrozenMap { + protected HeadersSchemaMap(FrozenMap m) { + super(m); + } + public static final Set requiredKeys = Set.of(); + public static final Set optionalKeys = Set.of( + "someHeader" + ); + public static HeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return HeadersSchema1.getInstance().validate(arg, configuration); + } + + public String someHeader() throws UnsetPropertyException { + return getOrThrow("someHeader"); + } + } + + public interface SetterForSomeHeader { + Map getInstance(); + T getBuilderAfterSomeHeader(Map instance); + + default T someHeader(String value) { + var instance = getInstance(); + instance.put("someHeader", value); + return getBuilderAfterSomeHeader(instance); + } + } + + public static class HeadersSchemaMapBuilder implements GenericBuilder>, SetterForSomeHeader { + private final Map instance; + private static final Set knownKeys = Set.of( + "someHeader" + ); + public Set getKnownKeys() { + return knownKeys; + } + public HeadersSchemaMapBuilder() { + this.instance = new LinkedHashMap<>(); + } + public Map build() { + return instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMapBuilder getBuilderAfterSomeHeader(Map instance) { + return this; + } + } + + + public sealed interface HeadersSchema1Boxed permits HeadersSchema1BoxedMap { + @Nullable Object getData(); + } + + public record HeadersSchema1BoxedMap(HeadersSchemaMap data) implements HeadersSchema1Boxed { + @Override + public @Nullable Object getData() { + return data; + } + } + + + public static class HeadersSchema1 extends JsonSchema implements MapSchemaValidator { + private static @Nullable HeadersSchema1 instance = null; + + protected HeadersSchema1() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("someHeader", SomeHeaderSchema.SomeHeaderSchema1.class) + )) + .additionalProperties(AdditionalProperties.class) + ); + } + + public static HeadersSchema1 getInstance() { + if (instance == null) { + instance = new HeadersSchema1(); + } + return instance; + } + + public HeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + LinkedHashMap properties = new LinkedHashMap<>(); + for(Map.Entry entry: arg.entrySet()) { + @Nullable Object entryKey = entry.getKey(); + if (!(entryKey instanceof String)) { + throw new InvalidTypeException("Invalid non-string key value"); + } + String propertyName = (String) entryKey; + List propertyPathToItem = new ArrayList<>(pathToItem); + propertyPathToItem.add(propertyName); + Object value = entry.getValue(); + LinkedHashMap, Void> schemas = pathToSchemas.get(propertyPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); + if (!(propertyInstance instanceof String)) { + throw new InvalidTypeException("Invalid instantiated value"); + } + properties.put(propertyName, (String) propertyInstance); + } + FrozenMap castProperties = new FrozenMap<>(properties); + return new HeadersSchemaMap(castProperties); + } + + public HeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof Map) { + return validate((Map) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg instanceof Map) { + return getNewInstance((Map) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + @Override + public HeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + return new HeadersSchema1BoxedMap(validate(arg, configuration)); + } + @Override + public HeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof Map castArg) { + return validateAndBox(castArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java index 4e0a0752df7..41a13b7936b 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java @@ -1,529 +1,26 @@ package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; + +import org.openapijsonschematools.client.response.HeadersDeserializer; +import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers.Refschemaheader; +import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers.Int32; +import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers.Refcontentschemaheader; +import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers.StringHeader; +import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers.NumberHeader; + import java.util.Map; -import java.util.Objects; -import java.util.Set; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.components.headers.int32jsoncontenttypeheader.content.applicationjson.Int32JsonContentTypeHeaderSchema; -import org.openapijsonschematools.client.components.headers.numberheader.NumberHeaderSchema; -import org.openapijsonschematools.client.components.headers.stringheader.StringHeaderSchema; -import org.openapijsonschematools.client.components.schemas.StringWithValidation; -import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; -import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.exceptions.InvalidTypeException; -import org.openapijsonschematools.client.exceptions.UnsetPropertyException; -import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; -import org.openapijsonschematools.client.schemas.GenericBuilder; -import org.openapijsonschematools.client.schemas.NotAnyTypeJsonSchema; -import org.openapijsonschematools.client.schemas.validation.FrozenMap; -import org.openapijsonschematools.client.schemas.validation.JsonSchema; -import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; -import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; -import org.openapijsonschematools.client.schemas.validation.MapUtils; -import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; -import org.openapijsonschematools.client.schemas.validation.PropertyEntry; -import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; +import java.util.AbstractMap; -public class Headers { - // nest classes so all schemas and input/output classes can be public - - - public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { - // NotAnyTypeSchema - private static @Nullable AdditionalProperties instance = null; - public static AdditionalProperties getInstance() { - if (instance == null) { - instance = new AdditionalProperties(); - } - return instance; - } - } - - - public static class HeadersMap extends FrozenMap<@Nullable Object> { - protected HeadersMap(FrozenMap<@Nullable Object> m) { - super(m); - } - public static final Set requiredKeys = Set.of( - "int32", - "ref-content-schema-header", - "ref-schema-header", - "stringHeader" - ); - public static final Set optionalKeys = Set.of( - "numberHeader" +public class Headers extends HeadersDeserializer { + public Headers() { + super( + Map.ofEntries( + new AbstractMap.SimpleEntry<>("ref-schema-header", new Refschemaheader.Refschemaheader1()), + new AbstractMap.SimpleEntry<>("int32", new Int32.Int321()), + new AbstractMap.SimpleEntry<>("ref-content-schema-header", new Refcontentschemaheader.Refcontentschemaheader1()), + new AbstractMap.SimpleEntry<>("stringHeader", new StringHeader.StringHeader1()), + new AbstractMap.SimpleEntry<>("numberHeader", new NumberHeader.NumberHeader1()) + ), + HeadersSchema.HeadersSchema1.getInstance() ); - public static HeadersMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { - return Headers1.getInstance().validate(arg, configuration); - } - - public Number int32() { - @Nullable Object value = get("int32"); - if (!(value instanceof Number)) { - throw new InvalidTypeException("Invalid value stored for int32"); - } - return (Number) value; - } - - public String stringHeader() { - @Nullable Object value = get("stringHeader"); - if (!(value instanceof String)) { - throw new InvalidTypeException("Invalid value stored for stringHeader"); - } - return (String) value; - } - - public String numberHeader() throws UnsetPropertyException { - String key = "numberHeader"; - throwIfKeyNotPresent(key); - @Nullable Object value = get(key); - if (!(value instanceof String)) { - throw new InvalidTypeException("Invalid value stored for numberHeader"); - } - return (String) value; - } - } - - public interface SetterForInt32 { - Map getInstance(); - T getBuilderAfterInt32(Map instance); - - default T int32(int value) { - var instance = getInstance(); - instance.put("int32", value); - return getBuilderAfterInt32(instance); - } - - default T int32(float value) { - var instance = getInstance(); - instance.put("int32", value); - return getBuilderAfterInt32(instance); - } - } - - public interface SetterForRefcontentschemaheader { - Map getInstance(); - T getBuilderAfterRefcontentschemaheader(Map instance); - - default T setRefHyphenMinusContentHyphenMinusSchemaHyphenMinusHeader(String value) { - var instance = getInstance(); - instance.put("ref-content-schema-header", value); - return getBuilderAfterRefcontentschemaheader(instance); - } - } - - public interface SetterForRefschemaheader { - Map getInstance(); - T getBuilderAfterRefschemaheader(Map instance); - - default T setRefHyphenMinusSchemaHyphenMinusHeader(String value) { - var instance = getInstance(); - instance.put("ref-schema-header", value); - return getBuilderAfterRefschemaheader(instance); - } - } - - public interface SetterForStringHeader { - Map getInstance(); - T getBuilderAfterStringHeader(Map instance); - - default T stringHeader(String value) { - var instance = getInstance(); - instance.put("stringHeader", value); - return getBuilderAfterStringHeader(instance); - } - } - - public interface SetterForNumberHeader { - Map getInstance(); - T getBuilderAfterNumberHeader(Map instance); - - default T numberHeader(String value) { - var instance = getInstance(); - instance.put("numberHeader", value); - return getBuilderAfterNumberHeader(instance); - } - } - - public static class HeadersMap0000Builder implements GenericBuilder>, SetterForNumberHeader { - private final Map instance; - private static final Set knownKeys = Set.of( - "int32", - "ref-content-schema-header", - "ref-schema-header", - "stringHeader", - "numberHeader" - ); - public Set getKnownKeys() { - return knownKeys; - } - public HeadersMap0000Builder(Map instance) { - this.instance = instance; - } - public Map build() { - return instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0000Builder getBuilderAfterNumberHeader(Map instance) { - return this; - } - } - - public static class HeadersMap0001Builder implements SetterForStringHeader { - private final Map instance; - public HeadersMap0001Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0000Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersMap0000Builder(instance); - } - } - - public static class HeadersMap0010Builder implements SetterForRefschemaheader { - private final Map instance; - public HeadersMap0010Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0000Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersMap0000Builder(instance); - } - } - - public static class HeadersMap0011Builder implements SetterForRefschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersMap0011Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0001Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersMap0001Builder(instance); - } - public HeadersMap0010Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersMap0010Builder(instance); - } - } - - public static class HeadersMap0100Builder implements SetterForRefcontentschemaheader { - private final Map instance; - public HeadersMap0100Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0000Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap0000Builder(instance); - } } - - public static class HeadersMap0101Builder implements SetterForRefcontentschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersMap0101Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0001Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap0001Builder(instance); - } - public HeadersMap0100Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersMap0100Builder(instance); - } - } - - public static class HeadersMap0110Builder implements SetterForRefcontentschemaheader, SetterForRefschemaheader { - private final Map instance; - public HeadersMap0110Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0010Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap0010Builder(instance); - } - public HeadersMap0100Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersMap0100Builder(instance); - } - } - - public static class HeadersMap0111Builder implements SetterForRefcontentschemaheader, SetterForRefschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersMap0111Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0011Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap0011Builder(instance); - } - public HeadersMap0101Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersMap0101Builder(instance); - } - public HeadersMap0110Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersMap0110Builder(instance); - } - } - - public static class HeadersMap1000Builder implements SetterForInt32 { - private final Map instance; - public HeadersMap1000Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0000Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap0000Builder(instance); - } - } - - public static class HeadersMap1001Builder implements SetterForInt32, SetterForStringHeader { - private final Map instance; - public HeadersMap1001Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0001Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap0001Builder(instance); - } - public HeadersMap1000Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersMap1000Builder(instance); - } - } - - public static class HeadersMap1010Builder implements SetterForInt32, SetterForRefschemaheader { - private final Map instance; - public HeadersMap1010Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0010Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap0010Builder(instance); - } - public HeadersMap1000Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersMap1000Builder(instance); - } - } - - public static class HeadersMap1011Builder implements SetterForInt32, SetterForRefschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersMap1011Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0011Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap0011Builder(instance); - } - public HeadersMap1001Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersMap1001Builder(instance); - } - public HeadersMap1010Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersMap1010Builder(instance); - } - } - - public static class HeadersMap1100Builder implements SetterForInt32, SetterForRefcontentschemaheader { - private final Map instance; - public HeadersMap1100Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0100Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap0100Builder(instance); - } - public HeadersMap1000Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap1000Builder(instance); - } - } - - public static class HeadersMap1101Builder implements SetterForInt32, SetterForRefcontentschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersMap1101Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0101Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap0101Builder(instance); - } - public HeadersMap1001Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap1001Builder(instance); - } - public HeadersMap1100Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersMap1100Builder(instance); - } - } - - public static class HeadersMap1110Builder implements SetterForInt32, SetterForRefcontentschemaheader, SetterForRefschemaheader { - private final Map instance; - public HeadersMap1110Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap0110Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap0110Builder(instance); - } - public HeadersMap1010Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap1010Builder(instance); - } - public HeadersMap1100Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersMap1100Builder(instance); - } - } - - public static class HeadersMapBuilder implements SetterForInt32, SetterForRefcontentschemaheader, SetterForRefschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersMapBuilder() { - this.instance = new LinkedHashMap<>(); - } - public Map getInstance() { - return instance; - } - public HeadersMap0111Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap0111Builder(instance); - } - public HeadersMap1011Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap1011Builder(instance); - } - public HeadersMap1101Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersMap1101Builder(instance); - } - public HeadersMap1110Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersMap1110Builder(instance); - } - } - - - public sealed interface Headers1Boxed permits Headers1BoxedMap { - @Nullable Object getData(); - } - - public record Headers1BoxedMap(HeadersMap data) implements Headers1Boxed { - @Override - public @Nullable Object getData() { - return data; - } - } - - - public static class Headers1 extends JsonSchema implements MapSchemaValidator { - private static @Nullable Headers1 instance = null; - - protected Headers1() { - super(new JsonSchemaInfo() - .type(Set.of(Map.class)) - .properties(Map.ofEntries( - new PropertyEntry("ref-schema-header", StringWithValidation.StringWithValidation1.class), - new PropertyEntry("int32", Int32JsonContentTypeHeaderSchema.Int32JsonContentTypeHeaderSchema1.class), - new PropertyEntry("ref-content-schema-header", StringWithValidation.StringWithValidation1.class), - new PropertyEntry("stringHeader", StringHeaderSchema.StringHeaderSchema1.class), - new PropertyEntry("numberHeader", NumberHeaderSchema.NumberHeaderSchema1.class) - )) - .required(Set.of( - "int32", - "ref-content-schema-header", - "ref-schema-header", - "stringHeader" - )) - .additionalProperties(AdditionalProperties.class) - ); - } - - public static Headers1 getInstance() { - if (instance == null) { - instance = new Headers1(); - } - return instance; - } - - public HeadersMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { - LinkedHashMap properties = new LinkedHashMap<>(); - for(Map.Entry entry: arg.entrySet()) { - @Nullable Object entryKey = entry.getKey(); - if (!(entryKey instanceof String)) { - throw new InvalidTypeException("Invalid non-string key value"); - } - String propertyName = (String) entryKey; - List propertyPathToItem = new ArrayList<>(pathToItem); - propertyPathToItem.add(propertyName); - Object value = entry.getValue(); - LinkedHashMap, Void> schemas = pathToSchemas.get(propertyPathToItem); - if (schemas == null) { - throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); - } - JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); - @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); - properties.put(propertyName, propertyInstance); - } - FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); - return new HeadersMap(castProperties); - } - - public HeadersMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - Set> pathSet = new HashSet<>(); - List pathToItem = List.of("args[0"); - Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); - SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); - ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); - PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); - return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); - } - - - @Override - public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - if (arg instanceof Map) { - return validate((Map) arg, configuration); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); - } - @Override - public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { - if (arg instanceof Map) { - return getNewInstance((Map) arg, pathToItem, pathToSchemas); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); - } - @Override - public Headers1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - return new Headers1BoxedMap(validate(arg, configuration)); - } - @Override - public Headers1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - if (arg instanceof Map castArg) { - return validateAndBox(castArg, configuration); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); - } - } - -} +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/HeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/HeadersSchema.java new file mode 100644 index 00000000000..04f733cce5b --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/HeadersSchema.java @@ -0,0 +1,529 @@ +package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.components.headers.int32jsoncontenttypeheader.content.applicationjson.Int32JsonContentTypeHeaderSchema; +import org.openapijsonschematools.client.components.headers.numberheader.NumberHeaderSchema; +import org.openapijsonschematools.client.components.headers.stringheader.StringHeaderSchema; +import org.openapijsonschematools.client.components.schemas.StringWithValidation; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.GenericBuilder; +import org.openapijsonschematools.client.schemas.NotAnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.validation.FrozenMap; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; +import org.openapijsonschematools.client.schemas.validation.PropertyEntry; +import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; + +public class HeadersSchema { + // nest classes so all schemas and input/output classes can be public + + + public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { + // NotAnyTypeSchema + private static @Nullable AdditionalProperties instance = null; + public static AdditionalProperties getInstance() { + if (instance == null) { + instance = new AdditionalProperties(); + } + return instance; + } + } + + + public static class HeadersSchemaMap extends FrozenMap<@Nullable Object> { + protected HeadersSchemaMap(FrozenMap<@Nullable Object> m) { + super(m); + } + public static final Set requiredKeys = Set.of( + "int32", + "ref-content-schema-header", + "ref-schema-header", + "stringHeader" + ); + public static final Set optionalKeys = Set.of( + "numberHeader" + ); + public static HeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return HeadersSchema1.getInstance().validate(arg, configuration); + } + + public Number int32() { + @Nullable Object value = get("int32"); + if (!(value instanceof Number)) { + throw new InvalidTypeException("Invalid value stored for int32"); + } + return (Number) value; + } + + public String stringHeader() { + @Nullable Object value = get("stringHeader"); + if (!(value instanceof String)) { + throw new InvalidTypeException("Invalid value stored for stringHeader"); + } + return (String) value; + } + + public String numberHeader() throws UnsetPropertyException { + String key = "numberHeader"; + throwIfKeyNotPresent(key); + @Nullable Object value = get(key); + if (!(value instanceof String)) { + throw new InvalidTypeException("Invalid value stored for numberHeader"); + } + return (String) value; + } + } + + public interface SetterForInt32 { + Map getInstance(); + T getBuilderAfterInt32(Map instance); + + default T int32(int value) { + var instance = getInstance(); + instance.put("int32", value); + return getBuilderAfterInt32(instance); + } + + default T int32(float value) { + var instance = getInstance(); + instance.put("int32", value); + return getBuilderAfterInt32(instance); + } + } + + public interface SetterForRefcontentschemaheader { + Map getInstance(); + T getBuilderAfterRefcontentschemaheader(Map instance); + + default T setRefHyphenMinusContentHyphenMinusSchemaHyphenMinusHeader(String value) { + var instance = getInstance(); + instance.put("ref-content-schema-header", value); + return getBuilderAfterRefcontentschemaheader(instance); + } + } + + public interface SetterForRefschemaheader { + Map getInstance(); + T getBuilderAfterRefschemaheader(Map instance); + + default T setRefHyphenMinusSchemaHyphenMinusHeader(String value) { + var instance = getInstance(); + instance.put("ref-schema-header", value); + return getBuilderAfterRefschemaheader(instance); + } + } + + public interface SetterForStringHeader { + Map getInstance(); + T getBuilderAfterStringHeader(Map instance); + + default T stringHeader(String value) { + var instance = getInstance(); + instance.put("stringHeader", value); + return getBuilderAfterStringHeader(instance); + } + } + + public interface SetterForNumberHeader { + Map getInstance(); + T getBuilderAfterNumberHeader(Map instance); + + default T numberHeader(String value) { + var instance = getInstance(); + instance.put("numberHeader", value); + return getBuilderAfterNumberHeader(instance); + } + } + + public static class HeadersSchemaMap0000Builder implements GenericBuilder>, SetterForNumberHeader { + private final Map instance; + private static final Set knownKeys = Set.of( + "int32", + "ref-content-schema-header", + "ref-schema-header", + "stringHeader", + "numberHeader" + ); + public Set getKnownKeys() { + return knownKeys; + } + public HeadersSchemaMap0000Builder(Map instance) { + this.instance = instance; + } + public Map build() { + return instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0000Builder getBuilderAfterNumberHeader(Map instance) { + return this; + } + } + + public static class HeadersSchemaMap0001Builder implements SetterForStringHeader { + private final Map instance; + public HeadersSchemaMap0001Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0000Builder getBuilderAfterStringHeader(Map instance) { + return new HeadersSchemaMap0000Builder(instance); + } + } + + public static class HeadersSchemaMap0010Builder implements SetterForRefschemaheader { + private final Map instance; + public HeadersSchemaMap0010Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0000Builder getBuilderAfterRefschemaheader(Map instance) { + return new HeadersSchemaMap0000Builder(instance); + } + } + + public static class HeadersSchemaMap0011Builder implements SetterForRefschemaheader, SetterForStringHeader { + private final Map instance; + public HeadersSchemaMap0011Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0001Builder getBuilderAfterRefschemaheader(Map instance) { + return new HeadersSchemaMap0001Builder(instance); + } + public HeadersSchemaMap0010Builder getBuilderAfterStringHeader(Map instance) { + return new HeadersSchemaMap0010Builder(instance); + } + } + + public static class HeadersSchemaMap0100Builder implements SetterForRefcontentschemaheader { + private final Map instance; + public HeadersSchemaMap0100Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0000Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap0000Builder(instance); + } + } + + public static class HeadersSchemaMap0101Builder implements SetterForRefcontentschemaheader, SetterForStringHeader { + private final Map instance; + public HeadersSchemaMap0101Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0001Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap0001Builder(instance); + } + public HeadersSchemaMap0100Builder getBuilderAfterStringHeader(Map instance) { + return new HeadersSchemaMap0100Builder(instance); + } + } + + public static class HeadersSchemaMap0110Builder implements SetterForRefcontentschemaheader, SetterForRefschemaheader { + private final Map instance; + public HeadersSchemaMap0110Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0010Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap0010Builder(instance); + } + public HeadersSchemaMap0100Builder getBuilderAfterRefschemaheader(Map instance) { + return new HeadersSchemaMap0100Builder(instance); + } + } + + public static class HeadersSchemaMap0111Builder implements SetterForRefcontentschemaheader, SetterForRefschemaheader, SetterForStringHeader { + private final Map instance; + public HeadersSchemaMap0111Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0011Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap0011Builder(instance); + } + public HeadersSchemaMap0101Builder getBuilderAfterRefschemaheader(Map instance) { + return new HeadersSchemaMap0101Builder(instance); + } + public HeadersSchemaMap0110Builder getBuilderAfterStringHeader(Map instance) { + return new HeadersSchemaMap0110Builder(instance); + } + } + + public static class HeadersSchemaMap1000Builder implements SetterForInt32 { + private final Map instance; + public HeadersSchemaMap1000Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0000Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap0000Builder(instance); + } + } + + public static class HeadersSchemaMap1001Builder implements SetterForInt32, SetterForStringHeader { + private final Map instance; + public HeadersSchemaMap1001Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0001Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap0001Builder(instance); + } + public HeadersSchemaMap1000Builder getBuilderAfterStringHeader(Map instance) { + return new HeadersSchemaMap1000Builder(instance); + } + } + + public static class HeadersSchemaMap1010Builder implements SetterForInt32, SetterForRefschemaheader { + private final Map instance; + public HeadersSchemaMap1010Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0010Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap0010Builder(instance); + } + public HeadersSchemaMap1000Builder getBuilderAfterRefschemaheader(Map instance) { + return new HeadersSchemaMap1000Builder(instance); + } + } + + public static class HeadersSchemaMap1011Builder implements SetterForInt32, SetterForRefschemaheader, SetterForStringHeader { + private final Map instance; + public HeadersSchemaMap1011Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0011Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap0011Builder(instance); + } + public HeadersSchemaMap1001Builder getBuilderAfterRefschemaheader(Map instance) { + return new HeadersSchemaMap1001Builder(instance); + } + public HeadersSchemaMap1010Builder getBuilderAfterStringHeader(Map instance) { + return new HeadersSchemaMap1010Builder(instance); + } + } + + public static class HeadersSchemaMap1100Builder implements SetterForInt32, SetterForRefcontentschemaheader { + private final Map instance; + public HeadersSchemaMap1100Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0100Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap0100Builder(instance); + } + public HeadersSchemaMap1000Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap1000Builder(instance); + } + } + + public static class HeadersSchemaMap1101Builder implements SetterForInt32, SetterForRefcontentschemaheader, SetterForStringHeader { + private final Map instance; + public HeadersSchemaMap1101Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0101Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap0101Builder(instance); + } + public HeadersSchemaMap1001Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap1001Builder(instance); + } + public HeadersSchemaMap1100Builder getBuilderAfterStringHeader(Map instance) { + return new HeadersSchemaMap1100Builder(instance); + } + } + + public static class HeadersSchemaMap1110Builder implements SetterForInt32, SetterForRefcontentschemaheader, SetterForRefschemaheader { + private final Map instance; + public HeadersSchemaMap1110Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0110Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap0110Builder(instance); + } + public HeadersSchemaMap1010Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap1010Builder(instance); + } + public HeadersSchemaMap1100Builder getBuilderAfterRefschemaheader(Map instance) { + return new HeadersSchemaMap1100Builder(instance); + } + } + + public static class HeadersSchemaMapBuilder implements SetterForInt32, SetterForRefcontentschemaheader, SetterForRefschemaheader, SetterForStringHeader { + private final Map instance; + public HeadersSchemaMapBuilder() { + this.instance = new LinkedHashMap<>(); + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap0111Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap0111Builder(instance); + } + public HeadersSchemaMap1011Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap1011Builder(instance); + } + public HeadersSchemaMap1101Builder getBuilderAfterRefschemaheader(Map instance) { + return new HeadersSchemaMap1101Builder(instance); + } + public HeadersSchemaMap1110Builder getBuilderAfterStringHeader(Map instance) { + return new HeadersSchemaMap1110Builder(instance); + } + } + + + public sealed interface HeadersSchema1Boxed permits HeadersSchema1BoxedMap { + @Nullable Object getData(); + } + + public record HeadersSchema1BoxedMap(HeadersSchemaMap data) implements HeadersSchema1Boxed { + @Override + public @Nullable Object getData() { + return data; + } + } + + + public static class HeadersSchema1 extends JsonSchema implements MapSchemaValidator { + private static @Nullable HeadersSchema1 instance = null; + + protected HeadersSchema1() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("ref-schema-header", StringWithValidation.StringWithValidation1.class), + new PropertyEntry("int32", Int32JsonContentTypeHeaderSchema.Int32JsonContentTypeHeaderSchema1.class), + new PropertyEntry("ref-content-schema-header", StringWithValidation.StringWithValidation1.class), + new PropertyEntry("stringHeader", StringHeaderSchema.StringHeaderSchema1.class), + new PropertyEntry("numberHeader", NumberHeaderSchema.NumberHeaderSchema1.class) + )) + .required(Set.of( + "int32", + "ref-content-schema-header", + "ref-schema-header", + "stringHeader" + )) + .additionalProperties(AdditionalProperties.class) + ); + } + + public static HeadersSchema1 getInstance() { + if (instance == null) { + instance = new HeadersSchema1(); + } + return instance; + } + + public HeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + LinkedHashMap properties = new LinkedHashMap<>(); + for(Map.Entry entry: arg.entrySet()) { + @Nullable Object entryKey = entry.getKey(); + if (!(entryKey instanceof String)) { + throw new InvalidTypeException("Invalid non-string key value"); + } + String propertyName = (String) entryKey; + List propertyPathToItem = new ArrayList<>(pathToItem); + propertyPathToItem.add(propertyName); + Object value = entry.getValue(); + LinkedHashMap, Void> schemas = pathToSchemas.get(propertyPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); + properties.put(propertyName, propertyInstance); + } + FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); + return new HeadersSchemaMap(castProperties); + } + + public HeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof Map) { + return validate((Map) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg instanceof Map) { + return getNewInstance((Map) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + @Override + public HeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + return new HeadersSchema1BoxedMap(validate(arg, configuration)); + } + @Override + public HeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof Map castArg) { + return validateAndBox(castArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java index 00292572e1a..f270bbeadd1 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java @@ -1,390 +1,26 @@ package org.openapijsonschematools.client.paths.userlogin.get.responses.code200response; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; + +import org.openapijsonschematools.client.response.HeadersDeserializer; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.XRateLimit; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.Int32; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.XExpiresAfter; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.Refcontentschemaheader; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.NumberHeader; + import java.util.Map; -import java.util.Objects; -import java.util.Set; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.components.headers.int32jsoncontenttypeheader.content.applicationjson.Int32JsonContentTypeHeaderSchema; -import org.openapijsonschematools.client.components.headers.numberheader.NumberHeaderSchema; -import org.openapijsonschematools.client.components.schemas.StringWithValidation; -import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; -import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.exceptions.InvalidTypeException; -import org.openapijsonschematools.client.exceptions.UnsetPropertyException; -import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.xexpiresafter.XExpiresAfterSchema; -import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.xratelimit.content.applicationjson.XRateLimitSchema; -import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; -import org.openapijsonschematools.client.schemas.GenericBuilder; -import org.openapijsonschematools.client.schemas.NotAnyTypeJsonSchema; -import org.openapijsonschematools.client.schemas.validation.FrozenMap; -import org.openapijsonschematools.client.schemas.validation.JsonSchema; -import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; -import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; -import org.openapijsonschematools.client.schemas.validation.MapUtils; -import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; -import org.openapijsonschematools.client.schemas.validation.PropertyEntry; -import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; +import java.util.AbstractMap; -public class Headers { - // nest classes so all schemas and input/output classes can be public - - - public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { - // NotAnyTypeSchema - private static @Nullable AdditionalProperties instance = null; - public static AdditionalProperties getInstance() { - if (instance == null) { - instance = new AdditionalProperties(); - } - return instance; - } - } - - - public static class HeadersMap extends FrozenMap<@Nullable Object> { - protected HeadersMap(FrozenMap<@Nullable Object> m) { - super(m); - } - public static final Set requiredKeys = Set.of( - "X-Rate-Limit", - "int32", - "ref-content-schema-header" - ); - public static final Set optionalKeys = Set.of( - "X-Expires-After", - "numberHeader" - ); - public static HeadersMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { - return Headers1.getInstance().validate(arg, configuration); - } - - public Number int32() { - @Nullable Object value = get("int32"); - if (!(value instanceof Number)) { - throw new InvalidTypeException("Invalid value stored for int32"); - } - return (Number) value; - } - - public String numberHeader() throws UnsetPropertyException { - String key = "numberHeader"; - throwIfKeyNotPresent(key); - @Nullable Object value = get(key); - if (!(value instanceof String)) { - throw new InvalidTypeException("Invalid value stored for numberHeader"); - } - return (String) value; - } - } - - public interface SetterForXRateLimit { - Map getInstance(); - T getBuilderAfterXRateLimit(Map instance); - - default T setXHyphenMinusRateHyphenMinusLimit(int value) { - var instance = getInstance(); - instance.put("X-Rate-Limit", value); - return getBuilderAfterXRateLimit(instance); - } - - default T setXHyphenMinusRateHyphenMinusLimit(float value) { - var instance = getInstance(); - instance.put("X-Rate-Limit", value); - return getBuilderAfterXRateLimit(instance); - } - } - - public interface SetterForInt32 { - Map getInstance(); - T getBuilderAfterInt32(Map instance); - - default T int32(int value) { - var instance = getInstance(); - instance.put("int32", value); - return getBuilderAfterInt32(instance); - } - - default T int32(float value) { - var instance = getInstance(); - instance.put("int32", value); - return getBuilderAfterInt32(instance); - } - } - - public interface SetterForRefcontentschemaheader { - Map getInstance(); - T getBuilderAfterRefcontentschemaheader(Map instance); - - default T setRefHyphenMinusContentHyphenMinusSchemaHyphenMinusHeader(String value) { - var instance = getInstance(); - instance.put("ref-content-schema-header", value); - return getBuilderAfterRefcontentschemaheader(instance); - } - } - - public interface SetterForXExpiresAfter { - Map getInstance(); - T getBuilderAfterXExpiresAfter(Map instance); - - default T setXHyphenMinusExpiresHyphenMinusAfter(String value) { - var instance = getInstance(); - instance.put("X-Expires-After", value); - return getBuilderAfterXExpiresAfter(instance); - } - } - - public interface SetterForNumberHeader { - Map getInstance(); - T getBuilderAfterNumberHeader(Map instance); - - default T numberHeader(String value) { - var instance = getInstance(); - instance.put("numberHeader", value); - return getBuilderAfterNumberHeader(instance); - } - } - - public static class HeadersMap000Builder implements GenericBuilder>, SetterForXExpiresAfter, SetterForNumberHeader { - private final Map instance; - private static final Set knownKeys = Set.of( - "X-Rate-Limit", - "int32", - "ref-content-schema-header", - "X-Expires-After", - "numberHeader" +public class Headers extends HeadersDeserializer { + public Headers() { + super( + Map.ofEntries( + new AbstractMap.SimpleEntry<>("X-Rate-Limit", new XRateLimit.XRateLimit1()), + new AbstractMap.SimpleEntry<>("int32", new Int32.Int321()), + new AbstractMap.SimpleEntry<>("X-Expires-After", new XExpiresAfter.XExpiresAfter1()), + new AbstractMap.SimpleEntry<>("ref-content-schema-header", new Refcontentschemaheader.Refcontentschemaheader1()), + new AbstractMap.SimpleEntry<>("numberHeader", new NumberHeader.NumberHeader1()) + ), + HeadersSchema.HeadersSchema1.getInstance() ); - public Set getKnownKeys() { - return knownKeys; - } - public HeadersMap000Builder(Map instance) { - this.instance = instance; - } - public Map build() { - return instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap000Builder getBuilderAfterXExpiresAfter(Map instance) { - return this; - } - public HeadersMap000Builder getBuilderAfterNumberHeader(Map instance) { - return this; - } } - - public static class HeadersMap001Builder implements SetterForRefcontentschemaheader { - private final Map instance; - public HeadersMap001Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap000Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap000Builder(instance); - } - } - - public static class HeadersMap010Builder implements SetterForInt32 { - private final Map instance; - public HeadersMap010Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap000Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap000Builder(instance); - } - } - - public static class HeadersMap011Builder implements SetterForInt32, SetterForRefcontentschemaheader { - private final Map instance; - public HeadersMap011Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap001Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap001Builder(instance); - } - public HeadersMap010Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap010Builder(instance); - } - } - - public static class HeadersMap100Builder implements SetterForXRateLimit { - private final Map instance; - public HeadersMap100Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap000Builder getBuilderAfterXRateLimit(Map instance) { - return new HeadersMap000Builder(instance); - } - } - - public static class HeadersMap101Builder implements SetterForXRateLimit, SetterForRefcontentschemaheader { - private final Map instance; - public HeadersMap101Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap001Builder getBuilderAfterXRateLimit(Map instance) { - return new HeadersMap001Builder(instance); - } - public HeadersMap100Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap100Builder(instance); - } - } - - public static class HeadersMap110Builder implements SetterForXRateLimit, SetterForInt32 { - private final Map instance; - public HeadersMap110Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersMap010Builder getBuilderAfterXRateLimit(Map instance) { - return new HeadersMap010Builder(instance); - } - public HeadersMap100Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap100Builder(instance); - } - } - - public static class HeadersMapBuilder implements SetterForXRateLimit, SetterForInt32, SetterForRefcontentschemaheader { - private final Map instance; - public HeadersMapBuilder() { - this.instance = new LinkedHashMap<>(); - } - public Map getInstance() { - return instance; - } - public HeadersMap011Builder getBuilderAfterXRateLimit(Map instance) { - return new HeadersMap011Builder(instance); - } - public HeadersMap101Builder getBuilderAfterInt32(Map instance) { - return new HeadersMap101Builder(instance); - } - public HeadersMap110Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersMap110Builder(instance); - } - } - - - public sealed interface Headers1Boxed permits Headers1BoxedMap { - @Nullable Object getData(); - } - - public record Headers1BoxedMap(HeadersMap data) implements Headers1Boxed { - @Override - public @Nullable Object getData() { - return data; - } - } - - - public static class Headers1 extends JsonSchema implements MapSchemaValidator { - private static @Nullable Headers1 instance = null; - - protected Headers1() { - super(new JsonSchemaInfo() - .type(Set.of(Map.class)) - .properties(Map.ofEntries( - new PropertyEntry("X-Rate-Limit", XRateLimitSchema.XRateLimitSchema1.class), - new PropertyEntry("int32", Int32JsonContentTypeHeaderSchema.Int32JsonContentTypeHeaderSchema1.class), - new PropertyEntry("X-Expires-After", XExpiresAfterSchema.XExpiresAfterSchema1.class), - new PropertyEntry("ref-content-schema-header", StringWithValidation.StringWithValidation1.class), - new PropertyEntry("numberHeader", NumberHeaderSchema.NumberHeaderSchema1.class) - )) - .required(Set.of( - "X-Rate-Limit", - "int32", - "ref-content-schema-header" - )) - .additionalProperties(AdditionalProperties.class) - ); - } - - public static Headers1 getInstance() { - if (instance == null) { - instance = new Headers1(); - } - return instance; - } - - public HeadersMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { - LinkedHashMap properties = new LinkedHashMap<>(); - for(Map.Entry entry: arg.entrySet()) { - @Nullable Object entryKey = entry.getKey(); - if (!(entryKey instanceof String)) { - throw new InvalidTypeException("Invalid non-string key value"); - } - String propertyName = (String) entryKey; - List propertyPathToItem = new ArrayList<>(pathToItem); - propertyPathToItem.add(propertyName); - Object value = entry.getValue(); - LinkedHashMap, Void> schemas = pathToSchemas.get(propertyPathToItem); - if (schemas == null) { - throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); - } - JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); - @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); - properties.put(propertyName, propertyInstance); - } - FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); - return new HeadersMap(castProperties); - } - - public HeadersMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - Set> pathSet = new HashSet<>(); - List pathToItem = List.of("args[0"); - Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); - SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); - ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); - PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); - return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); - } - - - @Override - public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - if (arg instanceof Map) { - return validate((Map) arg, configuration); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); - } - @Override - public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { - if (arg instanceof Map) { - return getNewInstance((Map) arg, pathToItem, pathToSchemas); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); - } - @Override - public Headers1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - return new Headers1BoxedMap(validate(arg, configuration)); - } - @Override - public Headers1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - if (arg instanceof Map castArg) { - return validateAndBox(castArg, configuration); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); - } - } - -} +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/HeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/HeadersSchema.java new file mode 100644 index 00000000000..c7a87c29d3d --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/HeadersSchema.java @@ -0,0 +1,390 @@ +package org.openapijsonschematools.client.paths.userlogin.get.responses.code200response; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.components.headers.int32jsoncontenttypeheader.content.applicationjson.Int32JsonContentTypeHeaderSchema; +import org.openapijsonschematools.client.components.headers.numberheader.NumberHeaderSchema; +import org.openapijsonschematools.client.components.schemas.StringWithValidation; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.xexpiresafter.XExpiresAfterSchema; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers.xratelimit.content.applicationjson.XRateLimitSchema; +import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.GenericBuilder; +import org.openapijsonschematools.client.schemas.NotAnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.validation.FrozenMap; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; +import org.openapijsonschematools.client.schemas.validation.PropertyEntry; +import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; + +public class HeadersSchema { + // nest classes so all schemas and input/output classes can be public + + + public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { + // NotAnyTypeSchema + private static @Nullable AdditionalProperties instance = null; + public static AdditionalProperties getInstance() { + if (instance == null) { + instance = new AdditionalProperties(); + } + return instance; + } + } + + + public static class HeadersSchemaMap extends FrozenMap<@Nullable Object> { + protected HeadersSchemaMap(FrozenMap<@Nullable Object> m) { + super(m); + } + public static final Set requiredKeys = Set.of( + "X-Rate-Limit", + "int32", + "ref-content-schema-header" + ); + public static final Set optionalKeys = Set.of( + "X-Expires-After", + "numberHeader" + ); + public static HeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return HeadersSchema1.getInstance().validate(arg, configuration); + } + + public Number int32() { + @Nullable Object value = get("int32"); + if (!(value instanceof Number)) { + throw new InvalidTypeException("Invalid value stored for int32"); + } + return (Number) value; + } + + public String numberHeader() throws UnsetPropertyException { + String key = "numberHeader"; + throwIfKeyNotPresent(key); + @Nullable Object value = get(key); + if (!(value instanceof String)) { + throw new InvalidTypeException("Invalid value stored for numberHeader"); + } + return (String) value; + } + } + + public interface SetterForXRateLimit { + Map getInstance(); + T getBuilderAfterXRateLimit(Map instance); + + default T setXHyphenMinusRateHyphenMinusLimit(int value) { + var instance = getInstance(); + instance.put("X-Rate-Limit", value); + return getBuilderAfterXRateLimit(instance); + } + + default T setXHyphenMinusRateHyphenMinusLimit(float value) { + var instance = getInstance(); + instance.put("X-Rate-Limit", value); + return getBuilderAfterXRateLimit(instance); + } + } + + public interface SetterForInt32 { + Map getInstance(); + T getBuilderAfterInt32(Map instance); + + default T int32(int value) { + var instance = getInstance(); + instance.put("int32", value); + return getBuilderAfterInt32(instance); + } + + default T int32(float value) { + var instance = getInstance(); + instance.put("int32", value); + return getBuilderAfterInt32(instance); + } + } + + public interface SetterForRefcontentschemaheader { + Map getInstance(); + T getBuilderAfterRefcontentschemaheader(Map instance); + + default T setRefHyphenMinusContentHyphenMinusSchemaHyphenMinusHeader(String value) { + var instance = getInstance(); + instance.put("ref-content-schema-header", value); + return getBuilderAfterRefcontentschemaheader(instance); + } + } + + public interface SetterForXExpiresAfter { + Map getInstance(); + T getBuilderAfterXExpiresAfter(Map instance); + + default T setXHyphenMinusExpiresHyphenMinusAfter(String value) { + var instance = getInstance(); + instance.put("X-Expires-After", value); + return getBuilderAfterXExpiresAfter(instance); + } + } + + public interface SetterForNumberHeader { + Map getInstance(); + T getBuilderAfterNumberHeader(Map instance); + + default T numberHeader(String value) { + var instance = getInstance(); + instance.put("numberHeader", value); + return getBuilderAfterNumberHeader(instance); + } + } + + public static class HeadersSchemaMap000Builder implements GenericBuilder>, SetterForXExpiresAfter, SetterForNumberHeader { + private final Map instance; + private static final Set knownKeys = Set.of( + "X-Rate-Limit", + "int32", + "ref-content-schema-header", + "X-Expires-After", + "numberHeader" + ); + public Set getKnownKeys() { + return knownKeys; + } + public HeadersSchemaMap000Builder(Map instance) { + this.instance = instance; + } + public Map build() { + return instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap000Builder getBuilderAfterXExpiresAfter(Map instance) { + return this; + } + public HeadersSchemaMap000Builder getBuilderAfterNumberHeader(Map instance) { + return this; + } + } + + public static class HeadersSchemaMap001Builder implements SetterForRefcontentschemaheader { + private final Map instance; + public HeadersSchemaMap001Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap000Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap000Builder(instance); + } + } + + public static class HeadersSchemaMap010Builder implements SetterForInt32 { + private final Map instance; + public HeadersSchemaMap010Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap000Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap000Builder(instance); + } + } + + public static class HeadersSchemaMap011Builder implements SetterForInt32, SetterForRefcontentschemaheader { + private final Map instance; + public HeadersSchemaMap011Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap001Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap001Builder(instance); + } + public HeadersSchemaMap010Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap010Builder(instance); + } + } + + public static class HeadersSchemaMap100Builder implements SetterForXRateLimit { + private final Map instance; + public HeadersSchemaMap100Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap000Builder getBuilderAfterXRateLimit(Map instance) { + return new HeadersSchemaMap000Builder(instance); + } + } + + public static class HeadersSchemaMap101Builder implements SetterForXRateLimit, SetterForRefcontentschemaheader { + private final Map instance; + public HeadersSchemaMap101Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap001Builder getBuilderAfterXRateLimit(Map instance) { + return new HeadersSchemaMap001Builder(instance); + } + public HeadersSchemaMap100Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap100Builder(instance); + } + } + + public static class HeadersSchemaMap110Builder implements SetterForXRateLimit, SetterForInt32 { + private final Map instance; + public HeadersSchemaMap110Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap010Builder getBuilderAfterXRateLimit(Map instance) { + return new HeadersSchemaMap010Builder(instance); + } + public HeadersSchemaMap100Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap100Builder(instance); + } + } + + public static class HeadersSchemaMapBuilder implements SetterForXRateLimit, SetterForInt32, SetterForRefcontentschemaheader { + private final Map instance; + public HeadersSchemaMapBuilder() { + this.instance = new LinkedHashMap<>(); + } + public Map getInstance() { + return instance; + } + public HeadersSchemaMap011Builder getBuilderAfterXRateLimit(Map instance) { + return new HeadersSchemaMap011Builder(instance); + } + public HeadersSchemaMap101Builder getBuilderAfterInt32(Map instance) { + return new HeadersSchemaMap101Builder(instance); + } + public HeadersSchemaMap110Builder getBuilderAfterRefcontentschemaheader(Map instance) { + return new HeadersSchemaMap110Builder(instance); + } + } + + + public sealed interface HeadersSchema1Boxed permits HeadersSchema1BoxedMap { + @Nullable Object getData(); + } + + public record HeadersSchema1BoxedMap(HeadersSchemaMap data) implements HeadersSchema1Boxed { + @Override + public @Nullable Object getData() { + return data; + } + } + + + public static class HeadersSchema1 extends JsonSchema implements MapSchemaValidator { + private static @Nullable HeadersSchema1 instance = null; + + protected HeadersSchema1() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("X-Rate-Limit", XRateLimitSchema.XRateLimitSchema1.class), + new PropertyEntry("int32", Int32JsonContentTypeHeaderSchema.Int32JsonContentTypeHeaderSchema1.class), + new PropertyEntry("X-Expires-After", XExpiresAfterSchema.XExpiresAfterSchema1.class), + new PropertyEntry("ref-content-schema-header", StringWithValidation.StringWithValidation1.class), + new PropertyEntry("numberHeader", NumberHeaderSchema.NumberHeaderSchema1.class) + )) + .required(Set.of( + "X-Rate-Limit", + "int32", + "ref-content-schema-header" + )) + .additionalProperties(AdditionalProperties.class) + ); + } + + public static HeadersSchema1 getInstance() { + if (instance == null) { + instance = new HeadersSchema1(); + } + return instance; + } + + public HeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + LinkedHashMap properties = new LinkedHashMap<>(); + for(Map.Entry entry: arg.entrySet()) { + @Nullable Object entryKey = entry.getKey(); + if (!(entryKey instanceof String)) { + throw new InvalidTypeException("Invalid non-string key value"); + } + String propertyName = (String) entryKey; + List propertyPathToItem = new ArrayList<>(pathToItem); + propertyPathToItem.add(propertyName); + Object value = entry.getValue(); + LinkedHashMap, Void> schemas = pathToSchemas.get(propertyPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); + properties.put(propertyName, propertyInstance); + } + FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); + return new HeadersSchemaMap(castProperties); + } + + public HeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof Map) { + return validate((Map) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg instanceof Map) { + return getNewInstance((Map) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + @Override + public HeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + return new HeadersSchema1BoxedMap(validate(arg, configuration)); + } + @Override + public HeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof Map castArg) { + return validateAndBox(castArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + +} diff --git a/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java b/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java index e5c76c2c851..aec07ea86a0 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java +++ b/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java @@ -653,7 +653,7 @@ private void generateResponse(List files, CodegenResponse response, String Map headersInfo = new HashMap<>(); headersInfo.put("headers", response.headers); headersInfo.put("headersObjectSchema", response.headersObjectSchema); - generateXs(files, headersJsonPath, CodegenConstants.JSON_PATH_LOCATION_TYPE.HEADERS, CodegenConstants.HEADERS, null, generator.shouldGenerateFile(headersJsonPath)); + generateXs(files, headersJsonPath, CodegenConstants.JSON_PATH_LOCATION_TYPE.HEADERS, CodegenConstants.HEADERS, headersInfo, generator.shouldGenerateFile(headersJsonPath)); for (Map.Entry headerInfo: response.headers.entrySet()) { String headerName = headerInfo.getKey(); CodegenHeader header = headerInfo.getValue(); @@ -661,8 +661,7 @@ private void generateResponse(List files, CodegenResponse response, String generateHeader(files, header, headerJsonPath, docRoot + "../../"); } // synthetic json path - String headersObjectJsonPath = jsonPath + "/Headers"; - generateSchema(files, response.headersObjectSchema, headersObjectJsonPath); + generateSchema(files, response.headersObjectSchema, response.headersObjectSchema.jsonPath); } LinkedHashMap content = response.content; if (content != null && !content.isEmpty()) { diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java index fa68b6f1aa2..1a3a621207f 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java @@ -153,6 +153,7 @@ public class DefaultGenerator implements Generator { protected String templateEngineName; + protected String headersSchemaFragment = "Headers"; static { DefaultFeatureSet = FeatureSet.newBuilder() @@ -3115,7 +3116,7 @@ public CodegenResponse fromResponse(ApiResponse response, String sourceJsonPath) Map finalVendorExtensions = vendorExtensions; TreeSet finalImports = imports; - CodegenSchema headersObjectSchema = getXParametersSchema(headersProperties, headersRequired, sourceJsonPath + "/" + "Headers", sourceJsonPath + "/" + "Headers"); + CodegenSchema headersObjectSchema = getXParametersSchema(headersProperties, headersRequired, sourceJsonPath + "/" + headersSchemaFragment, sourceJsonPath + "/" + headersSchemaFragment); String pathFromDocRoot = responsePathFromDocRoot(sourceJsonPath); String subpackage = getSubpackage(sourceJsonPath); r = new CodegenResponse(jsonPathPiece, headers, headersObjectSchema, description, finalVendorExtensions, content, refInfo, finalImports, componentModule, pathFromDocRoot, subpackage); @@ -3791,7 +3792,7 @@ protected void updateComponentsFilepath(String[] pathPieces) { // #/components/responses/SuccessWithJsonApiResponse/headers pathPieces[3] = toResponseModuleName(pathPieces[3], jsonPath); - if (pathPieces.length == 5 && pathPieces[4].equals("Headers")) { + if (pathPieces.length == 5 && pathPieces[4].equals(headersSchemaFragment)) { // synthetic json path // #/components/responses/someResponse/Headers pathPieces[4] = getSchemaFilename(jsonPath); @@ -3802,6 +3803,7 @@ protected void updateComponentsFilepath(String[] pathPieces) { return; } if (pathPieces[4].equals("headers")) { + pathPieces[4] = toHeaderFilename(pathPieces[4], jsonPath); // #/components/responses/someResponse/headers/SomeHeader-> length 6 pathPieces[5] = toHeaderFilename(pathPieces[5], jsonPath); if (pathPieces.length >= 8 && pathPieces[6].equals("content")) { @@ -3916,7 +3918,7 @@ private void updatePathsFilepath(String[] pathPieces) { } // #/paths/user_login/get/responses/200 -> 200 -> response_200 -> length 6 pathPieces[5] = toResponseModuleName(pathPieces[5], jsonPath); - if (pathPieces.length == 7 && pathPieces[6].equals("Headers")) { + if (pathPieces.length == 7 && pathPieces[6].equals(headersSchemaFragment)) { // synthetic json path // #/paths/user_login/get/responses/200/Headers pathPieces[6] = getSchemaFilename(jsonPath); @@ -3934,6 +3936,7 @@ private void updatePathsFilepath(String[] pathPieces) { pathPieces[8] = getSchemaFilename(jsonPath); } } else if (pathPieces[6].equals("headers")) { + pathPieces[6] = toHeaderFilename(pathPieces[6], jsonPath); // #/paths/somePath/get/responses/200/headers/someHeader -> length 8 pathPieces[7] = toHeaderFilename(pathPieces[7], jsonPath); diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 314f0026197..a1c4ed3f371 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -187,6 +187,7 @@ public String generatorLanguageVersion() { public JavaClientGenerator() { super(); + headersSchemaFragment = "HeadersSchema"; supportsInheritance = true; @@ -1007,14 +1008,20 @@ public String toHeaderFilename(String componentName, String jsonPath) { // deeper paths return toModuleFilename(componentName, jsonPath); } else if (jsonPath.startsWith("#/components/responses/")) { - if (pathPieces.length == 6) { + if (pathPieces.length == 5) { + // #/components/responses/SomeResponse/headers + return "Headers"; + } else if (pathPieces.length == 6 && !componentName.equals("headers")) { // #/components/responses/SomeResponse/headers/SomeHeader return toModelName(componentName, null); } // deeper paths return toModuleFilename(componentName, jsonPath); } - if (pathPieces.length == 8) { + if (pathPieces.length == 7) { + // #/paths/somePath/verb/responses/200/headers + return "Headers"; + } else if (pathPieces.length == 8 && !componentName.equals("headers")) { // #/paths/somePath/verb/responses/200/headers/SomeHeader return toModelName(componentName, null); } diff --git a/src/main/resources/java/src/main/java/packagename/components/responses/HeadersDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/components/responses/HeadersDeserializer.hbs index 9d2943e100b..00589fe3bee 100644 --- a/src/main/resources/java/src/main/java/packagename/components/responses/HeadersDeserializer.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/responses/HeadersDeserializer.hbs @@ -2,11 +2,23 @@ package {{packageName}}.{{headers.subpackage}}; import {{packageName}}.response.HeadersDeserializer; {{#each headers}} -import {{packageName}}.{{subpackage}}; +import {{packageName}}.{{subpackage}}.{{jsonPathPiece.pascalCase}}; {{/each}} + +import java.util.Map; +import java.util.AbstractMap; + +public class {{headers.jsonPathPiece.pascalCase}} extends HeadersDeserializer<{{#with headersObjectSchema}}{{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}}{{/with}}> { + public {{headers.jsonPathPiece.pascalCase}}() { + super( + Map.ofEntries( +{{#each headers}} + new AbstractMap.SimpleEntry<>("{{{@key}}}", new {{jsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}1()){{#unless @last}},{{/unless}} +{{/each}} + ), {{#with headersObjectSchema}} -import {{packageName}}.{{subpackage}}; + {{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}.getInstance() {{/with}} - -public class {{headers.jsonPathPiece.pascalCase}} extends HeadersDeserializer { + ); + } } \ No newline at end of file From e0699b667ba286d5e913bf15f4d4e7bd49f76499 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 18:10:45 -0800 Subject: [PATCH 19/32] Fixes case where imported header collided with the class name --- .../successwithjsonapiresponse/headers/NumberHeader.java | 2 +- .../get/responses/code200response/headers/NumberHeader.java | 2 +- .../src/main/java/packagename/components/headers/Header.hbs | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java index 9728f44108c..0fd5232f8d9 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java @@ -1,3 +1,3 @@ package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers; -import org.openapijsonschematools.client.components.headers.NumberHeader; +public class NumberHeader extends org.openapijsonschematools.client.components.headers.NumberHeader {} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java index 3157a432ff8..32207ae7232 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java @@ -1,3 +1,3 @@ package org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers; -import org.openapijsonschematools.client.components.headers.NumberHeader; +public class NumberHeader extends org.openapijsonschematools.client.components.headers.NumberHeader {} diff --git a/src/main/resources/java/src/main/java/packagename/components/headers/Header.hbs b/src/main/resources/java/src/main/java/packagename/components/headers/Header.hbs index d5f66524c6a..a53f77ffce2 100644 --- a/src/main/resources/java/src/main/java/packagename/components/headers/Header.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/headers/Header.hbs @@ -3,13 +3,19 @@ package {{packageName}}.{{subpackage}}; {{#if refInfo}} {{#neq subpackage refInfo.ref.subpackage}} + {{! must be in different packages }} + {{#neq jsonPathPiece.pascalCase refInfo.ref.jsonPathPiece.pascalCase}} + {{! class names must differ }} import {{packageName}}.{{refInfo.ref.subpackage}}.{{refInfo.refModule}}; + {{/neq}} {{/neq}} {{#neq jsonPathPiece.pascalCase refInfo.ref.jsonPathPiece.pascalCase}} public class {{jsonPathPiece.pascalCase}} extends {{refInfo.refModule}} { public static class {{jsonPathPiece.pascalCase}}1 extends {{refInfo.refModule}}1 {} } +{{else}} +public class {{jsonPathPiece.pascalCase}} extends {{packageName}}.{{refInfo.ref.subpackage}}.{{refInfo.refModule}} {} {{/neq}} {{else}} {{#if schema}} From 5c869289a47c21c02799866e22858bc67e7b5eb7 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 18:53:15 -0800 Subject: [PATCH 20/32] Fixes test warnings --- .../client/header/SchemaHeaderTest.java | 22 ++++++++++++++----- .../packagename/header/SchemaHeaderTest.hbs | 22 ++++++++++++++----- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java index 334497d9059..7b5795bcc14 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java @@ -120,32 +120,42 @@ private static SchemaHeader getHeader(JsonSchema schema) { ); } + @SuppressWarnings("nullness") + private void assertNull(@Nullable Object object) { + Assert.assertNull(object); + } + @Test public void testDeserialization() { SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); SchemaHeader header = getHeader(NullJsonSchema.NullJsonSchema1.getInstance()); var deserialized = header.deserialize(List.of(""), false, configuration); - Assert.assertEquals(deserialized, null); + assertNull(deserialized); header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); deserialized = header.deserialize(List.of("1"), false, configuration); - Assert.assertEquals(deserialized, 1L); + @Nullable Object expected = 1L; + Assert.assertEquals(expected, deserialized); header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); deserialized = header.deserialize(List.of("3.14"), false, configuration); - Assert.assertEquals(deserialized, 3.14d); + expected = 3.14d; + Assert.assertEquals(expected, deserialized); header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); deserialized = header.deserialize(List.of("blue"), false, configuration); - Assert.assertEquals(deserialized, "blue"); + expected = "blue"; + Assert.assertEquals(expected, deserialized); header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); deserialized = header.deserialize(List.of("hello world"), false, configuration); - Assert.assertEquals(deserialized, "hello world"); + expected = "hello world"; + Assert.assertEquals(expected, deserialized); header = getHeader(ListJsonSchema.ListJsonSchema1.getInstance()); deserialized = header.deserialize(List.of("blue", "black", "brown"), false, configuration); - Assert.assertEquals(deserialized, List.of("blue", "black", "brown")); + expected = List.of("blue", "black", "brown"); + Assert.assertEquals(expected, deserialized); } } diff --git a/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs b/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs index ceb9119f6e0..b93c64802c1 100644 --- a/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs +++ b/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs @@ -120,32 +120,42 @@ public class SchemaHeaderTest { ); } + @SuppressWarnings("nullness") + private void assertNull(@Nullable Object object) { + Assert.assertNull(object); + } + @Test public void testDeserialization() { SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); SchemaHeader header = getHeader(NullJsonSchema.NullJsonSchema1.getInstance()); var deserialized = header.deserialize(List.of(""), false, configuration); - Assert.assertEquals(deserialized, null); + assertNull(deserialized); header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); deserialized = header.deserialize(List.of("1"), false, configuration); - Assert.assertEquals(deserialized, 1L); + @Nullable Object expected = 1L; + Assert.assertEquals(expected, deserialized); header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); deserialized = header.deserialize(List.of("3.14"), false, configuration); - Assert.assertEquals(deserialized, 3.14d); + expected = 3.14d; + Assert.assertEquals(expected, deserialized); header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); deserialized = header.deserialize(List.of("blue"), false, configuration); - Assert.assertEquals(deserialized, "blue"); + expected = "blue"; + Assert.assertEquals(expected, deserialized); header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); deserialized = header.deserialize(List.of("hello world"), false, configuration); - Assert.assertEquals(deserialized, "hello world"); + expected = "hello world"; + Assert.assertEquals(expected, deserialized); header = getHeader(ListJsonSchema.ListJsonSchema1.getInstance()); deserialized = header.deserialize(List.of("blue", "black", "brown"), false, configuration); - Assert.assertEquals(deserialized, List.of("blue", "black", "brown")); + expected = List.of("blue", "black", "brown"); + Assert.assertEquals(expected, deserialized); } } From a8f7688df1fae2208f924b490da9a39cd7dfbec7 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 19:09:40 -0800 Subject: [PATCH 21/32] Integrates heeaders deserializer in the response deserializer --- .../components/responses/HeadersWithNoBody.java | 8 +++++--- .../responses/SuccessDescriptionOnly.java | 2 +- .../responses/SuccessInlineContentAndHeader.java | 8 +++++--- .../responses/SuccessWithJsonApiResponse.java | 8 +++++--- .../responses/SuccessfulXmlAndJsonArrayOfPet.java | 2 +- .../patch/responses/Code200Response.java | 2 +- .../paths/fake/get/responses/Code404Response.java | 2 +- .../fake/patch/responses/Code200Response.java | 2 +- .../paths/fake/post/responses/Code404Response.java | 2 +- .../get/responses/Code200Response.java | 2 +- .../patch/responses/Code200Response.java | 2 +- .../delete/responses/CodedefaultResponse.java | 2 +- .../fakehealth/get/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../get/responses/Code200Response.java | 2 +- .../get/responses/Code202Response.java | 2 +- .../get/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../get/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../get/responses/Code200Response.java | 2 +- .../get/responses/Code303Response.java | 2 +- .../get/responses/Code3XXResponse.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../get/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../post/responses/Code200Response.java | 2 +- .../get/responses/Code1XXResponse.java | 2 +- .../get/responses/Code200Response.java | 2 +- .../get/responses/Code2XXResponse.java | 2 +- .../get/responses/Code3XXResponse.java | 2 +- .../get/responses/Code4XXResponse.java | 2 +- .../get/responses/Code5XXResponse.java | 2 +- .../foo/get/responses/CodedefaultResponse.java | 2 +- .../paths/pet/post/responses/Code405Response.java | 2 +- .../paths/pet/put/responses/Code400Response.java | 2 +- .../paths/pet/put/responses/Code404Response.java | 2 +- .../paths/pet/put/responses/Code405Response.java | 2 +- .../get/responses/Code400Response.java | 2 +- .../get/responses/Code400Response.java | 2 +- .../petpetid/delete/responses/Code400Response.java | 2 +- .../petpetid/get/responses/Code200Response.java | 2 +- .../petpetid/get/responses/Code400Response.java | 2 +- .../petpetid/get/responses/Code404Response.java | 2 +- .../petpetid/post/responses/Code405Response.java | 2 +- .../storeorder/post/responses/Code200Response.java | 2 +- .../storeorder/post/responses/Code400Response.java | 2 +- .../delete/responses/Code400Response.java | 2 +- .../delete/responses/Code404Response.java | 2 +- .../get/responses/Code200Response.java | 2 +- .../get/responses/Code400Response.java | 2 +- .../get/responses/Code404Response.java | 2 +- .../user/post/responses/CodedefaultResponse.java | 2 +- .../post/responses/CodedefaultResponse.java | 2 +- .../post/responses/CodedefaultResponse.java | 2 +- .../userlogin/get/responses/Code200Response.java | 8 +++++--- .../userlogin/get/responses/Code400Response.java | 2 +- .../delete/responses/Code404Response.java | 2 +- .../get/responses/Code200Response.java | 2 +- .../get/responses/Code400Response.java | 2 +- .../get/responses/Code404Response.java | 2 +- .../put/responses/Code400Response.java | 2 +- .../put/responses/Code404Response.java | 2 +- .../client/response/ResponseDeserializer.java | 2 +- .../packagename/components/responses/Response.hbs | 14 ++++++++++++-- .../packagename/response/HeadersDeserializer.hbs | 1 + .../packagename/response/ResponseDeserializer.hbs | 2 +- 78 files changed, 105 insertions(+), 86 deletions(-) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/HeadersWithNoBody.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/HeadersWithNoBody.java index 816987cc22e..0e0ef035f0f 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/HeadersWithNoBody.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/HeadersWithNoBody.java @@ -5,6 +5,8 @@ import org.openapijsonschematools.client.response.DeserializedHttpResponse; import org.openapijsonschematools.client.exceptions.ApiException; import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.openapijsonschematools.client.components.responses.headerswithnobody.HeadersSchema; +import org.openapijsonschematools.client.components.responses.headerswithnobody.Headers; import java.util.Map; import java.net.http.HttpResponse; @@ -12,7 +14,7 @@ public class HeadersWithNoBody { - public static class HeadersWithNoBody1 extends ResponseDeserializer { + public static class HeadersWithNoBody1 extends ResponseDeserializer { public HeadersWithNoBody1() { super( MapUtils.makeMap( @@ -26,8 +28,8 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { - return null; + protected HeadersSchema.HeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { + return new Headers().deserialize(headers, configuration); } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessDescriptionOnly.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessDescriptionOnly.java index 7d708912240..c61f5c1dee0 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessDescriptionOnly.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessDescriptionOnly.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessInlineContentAndHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessInlineContentAndHeader.java index 9a2cb7de834..e89ba927e4e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessInlineContentAndHeader.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessInlineContentAndHeader.java @@ -6,6 +6,8 @@ import org.openapijsonschematools.client.exceptions.ApiException; import org.openapijsonschematools.client.mediatype.MediaType; import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.content.applicationjson.ApplicationjsonSchema; +import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.HeadersSchema; +import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.Headers; import java.util.AbstractMap; import java.util.Map; @@ -27,7 +29,7 @@ public Void encoding() { public sealed interface SealedResponseBody permits ApplicationjsonResponseBody {} public record ApplicationjsonResponseBody(ApplicationjsonSchema.ApplicationjsonSchema1Boxed body) implements SealedResponseBody { } - public static class SuccessInlineContentAndHeader1 extends ResponseDeserializer { + public static class SuccessInlineContentAndHeader1 extends ResponseDeserializer { public SuccessInlineContentAndHeader1() { super( Map.ofEntries( @@ -50,8 +52,8 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { - return null; + protected HeadersSchema.HeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { + return new Headers().deserialize(headers, configuration); } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java index 037f0c3c1de..8adea2c6f84 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java @@ -6,6 +6,8 @@ import org.openapijsonschematools.client.exceptions.ApiException; import org.openapijsonschematools.client.mediatype.MediaType; import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.content.applicationjson.ApplicationjsonSchema; +import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.HeadersSchema; +import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.Headers; import java.util.AbstractMap; import java.util.Map; @@ -27,7 +29,7 @@ public Void encoding() { public sealed interface SealedResponseBody permits ApplicationjsonResponseBody {} public record ApplicationjsonResponseBody(ApplicationjsonSchema.ApiResponseSchema1Boxed body) implements SealedResponseBody { } - public static class SuccessWithJsonApiResponse1 extends ResponseDeserializer { + public static class SuccessWithJsonApiResponse1 extends ResponseDeserializer { public SuccessWithJsonApiResponse1() { super( Map.ofEntries( @@ -50,8 +52,8 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { - return null; + protected HeadersSchema.HeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { + return new Headers().deserialize(headers, configuration); } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessfulXmlAndJsonArrayOfPet.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessfulXmlAndJsonArrayOfPet.java index 61661e78e34..7ed6c0ef51e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessfulXmlAndJsonArrayOfPet.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessfulXmlAndJsonArrayOfPet.java @@ -66,7 +66,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/responses/Code200Response.java index 1293a281abd..27ad3c01c6a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/get/responses/Code404Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/get/responses/Code404Response.java index 99ebf439860..bad071e523a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/get/responses/Code404Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/get/responses/Code404Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/patch/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/patch/responses/Code200Response.java index 2e4a85c500d..dcd5c9d2941 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/patch/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/patch/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/post/responses/Code404Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/post/responses/Code404Response.java index f3c502c31cc..fb498802410 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/post/responses/Code404Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/post/responses/Code404Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeadditionalpropertieswitharrayofenums/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeadditionalpropertieswitharrayofenums/get/responses/Code200Response.java index 2758a79261f..5a4986b6599 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeadditionalpropertieswitharrayofenums/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeadditionalpropertieswitharrayofenums/get/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeclassnametest/patch/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeclassnametest/patch/responses/Code200Response.java index 048455f6511..aa4e6dc53e3 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeclassnametest/patch/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeclassnametest/patch/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakedeletecoffeeid/delete/responses/CodedefaultResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakedeletecoffeeid/delete/responses/CodedefaultResponse.java index 89edaed917d..e770ec7cffa 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakedeletecoffeeid/delete/responses/CodedefaultResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakedeletecoffeeid/delete/responses/CodedefaultResponse.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakehealth/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakehealth/get/responses/Code200Response.java index 300c2f64365..c627ade2788 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakehealth/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakehealth/get/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlinecomposition/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlinecomposition/post/responses/Code200Response.java index c6d1b2107c6..27d0bbde2b1 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlinecomposition/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlinecomposition/post/responses/Code200Response.java @@ -66,7 +66,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonwithcharset/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonwithcharset/post/responses/Code200Response.java index 84f8047a02d..a8ca91508c2 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonwithcharset/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonwithcharset/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplerequestbodycontenttypes/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplerequestbodycontenttypes/post/responses/Code200Response.java index bcbeee49908..9f1305f5a53 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplerequestbodycontenttypes/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplerequestbodycontenttypes/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/responses/Code200Response.java index f36e27a553e..512d493671e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/responses/Code202Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/responses/Code202Response.java index 875d35d26f5..d1636e41852 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/responses/Code202Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/responses/Code202Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplesecurities/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplesecurities/get/responses/Code200Response.java index 57552668d20..e7e77c03021 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplesecurities/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplesecurities/get/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeparametercollisions1ababselfab/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeparametercollisions1ababselfab/post/responses/Code200Response.java index ba79c4fa0c3..6cb92112b23 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeparametercollisions1ababselfab/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeparametercollisions1ababselfab/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepemcontenttype/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepemcontenttype/get/responses/Code200Response.java index 235c0db2bfb..35ea54800af 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepemcontenttype/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepemcontenttype/get/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepetiduploadimagewithrequiredfile/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepetiduploadimagewithrequiredfile/post/responses/Code200Response.java index d86218a5273..df5ef4ffa28 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepetiduploadimagewithrequiredfile/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepetiduploadimagewithrequiredfile/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakequeryparamwithjsoncontenttype/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakequeryparamwithjsoncontenttype/get/responses/Code200Response.java index 947ef7b2c84..44a7d6d9a17 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakequeryparamwithjsoncontenttype/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakequeryparamwithjsoncontenttype/get/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/responses/Code303Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/responses/Code303Response.java index b9ca7d32b2c..fe6da3290d3 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/responses/Code303Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/responses/Code303Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/responses/Code3XXResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/responses/Code3XXResponse.java index 7b593a14eb5..0bceda71429 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/responses/Code3XXResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/responses/Code3XXResponse.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarraymodel/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarraymodel/post/responses/Code200Response.java index d01d31a29d3..d2fa881818b 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarraymodel/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarraymodel/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarrayofenums/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarrayofenums/post/responses/Code200Response.java index 6ca1121345a..9b5ea0b64fb 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarrayofenums/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarrayofenums/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsboolean/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsboolean/post/responses/Code200Response.java index d9c6b249dd6..390ac805456 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsboolean/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsboolean/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefscomposedoneofnumberwithvalidations/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefscomposedoneofnumberwithvalidations/post/responses/Code200Response.java index 13e9ad0468f..2261c15e675 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefscomposedoneofnumberwithvalidations/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefscomposedoneofnumberwithvalidations/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsenum/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsenum/post/responses/Code200Response.java index 0648d448807..8e6a2da362b 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsenum/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsenum/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsmammal/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsmammal/post/responses/Code200Response.java index 6966924d426..2d9310a09b8 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsmammal/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsmammal/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsnumber/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsnumber/post/responses/Code200Response.java index 6523d4260c1..bb1a8ebb079 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsnumber/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsnumber/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsobjectmodelwithrefprops/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsobjectmodelwithrefprops/post/responses/Code200Response.java index 149a66cb6ad..83e7c808d89 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsobjectmodelwithrefprops/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsobjectmodelwithrefprops/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsstring/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsstring/post/responses/Code200Response.java index cb9d8fe483e..7642e09bbab 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsstring/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsstring/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeresponsewithoutschema/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeresponsewithoutschema/get/responses/Code200Response.java index e0204129755..d9cc9ea080e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeresponsewithoutschema/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeresponsewithoutschema/get/responses/Code200Response.java @@ -29,7 +29,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploaddownloadfile/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploaddownloadfile/post/responses/Code200Response.java index a1c45b3b1b3..ed9e9a5ddd3 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploaddownloadfile/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploaddownloadfile/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfile/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfile/post/responses/Code200Response.java index cac546b0422..28e807c4652 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfile/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfile/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfiles/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfiles/post/responses/Code200Response.java index 06b0236ebd8..3a6ae53b8c7 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfiles/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfiles/post/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code1XXResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code1XXResponse.java index 65791d02f47..5ff45188ea1 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code1XXResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code1XXResponse.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code200Response.java index a19af7ac543..d3071a30f8b 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code200Response.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code2XXResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code2XXResponse.java index a907b488233..f228579433a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code2XXResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code2XXResponse.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code3XXResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code3XXResponse.java index f932612e779..ed9d6a23972 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code3XXResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code3XXResponse.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code4XXResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code4XXResponse.java index 682272e552d..eb7716a00f8 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code4XXResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code4XXResponse.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code5XXResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code5XXResponse.java index 081a68aa84e..9f7c642f907 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code5XXResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/responses/Code5XXResponse.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/responses/CodedefaultResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/responses/CodedefaultResponse.java index eacf0f81c6b..91752fd80e6 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/responses/CodedefaultResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/responses/CodedefaultResponse.java @@ -50,7 +50,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/post/responses/Code405Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/post/responses/Code405Response.java index fae6cd8468b..539923899ea 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/post/responses/Code405Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/post/responses/Code405Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code400Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code400Response.java index 8b6b7083e4c..e94b1366c9a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code400Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code400Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code404Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code404Response.java index 95d865b82ec..15458d50d4f 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code404Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code404Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code405Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code405Response.java index e3de76ccb57..e3ba5312b16 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code405Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/put/responses/Code405Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/get/responses/Code400Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/get/responses/Code400Response.java index 63257957989..43e52729869 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/get/responses/Code400Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/get/responses/Code400Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbytags/get/responses/Code400Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbytags/get/responses/Code400Response.java index 0b2dd4a964b..7d7ae379884 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbytags/get/responses/Code400Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbytags/get/responses/Code400Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/delete/responses/Code400Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/delete/responses/Code400Response.java index 60e17b7d517..1fdfd986a90 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/delete/responses/Code400Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/delete/responses/Code400Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code200Response.java index 009dadb66af..ebd39fc2a6e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code200Response.java @@ -66,7 +66,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code400Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code400Response.java index 32c66ffa011..7a6c696b19d 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code400Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code400Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code404Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code404Response.java index ee166e33acc..58e9da0d7dc 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code404Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/responses/Code404Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/post/responses/Code405Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/post/responses/Code405Response.java index 622bc8d8042..62d6a28f1be 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/post/responses/Code405Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/post/responses/Code405Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/responses/Code200Response.java index 0a0638b1551..955c9af34c2 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/responses/Code200Response.java @@ -66,7 +66,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/responses/Code400Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/responses/Code400Response.java index aa2870163ac..bf641ab9529 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/responses/Code400Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/responses/Code400Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/delete/responses/Code400Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/delete/responses/Code400Response.java index d24c6c5aa81..a0291a06814 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/delete/responses/Code400Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/delete/responses/Code400Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/delete/responses/Code404Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/delete/responses/Code404Response.java index 48b7679387f..99efb7324e5 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/delete/responses/Code404Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/delete/responses/Code404Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code200Response.java index 6d51490e90a..44e93fc81e5 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code200Response.java @@ -66,7 +66,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code400Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code400Response.java index 6eb5f5c1de8..00aa94771da 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code400Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code400Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code404Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code404Response.java index 4e7e5f5bef8..eb7b27cea75 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code404Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/responses/Code404Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/user/post/responses/CodedefaultResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/user/post/responses/CodedefaultResponse.java index fb814fa6a63..e3555812d7d 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/user/post/responses/CodedefaultResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/user/post/responses/CodedefaultResponse.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewitharray/post/responses/CodedefaultResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewitharray/post/responses/CodedefaultResponse.java index ff367f5c5d9..1de3940666e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewitharray/post/responses/CodedefaultResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewitharray/post/responses/CodedefaultResponse.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewithlist/post/responses/CodedefaultResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewithlist/post/responses/CodedefaultResponse.java index 452bbf99d47..71c7481101d 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewithlist/post/responses/CodedefaultResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewithlist/post/responses/CodedefaultResponse.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java index 12156c959d9..2851c02a22c 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java @@ -7,6 +7,8 @@ import org.openapijsonschematools.client.mediatype.MediaType; import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.content.applicationxml.ApplicationxmlSchema; import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.content.applicationjson.ApplicationjsonSchema; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.HeadersSchema; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.Headers; import java.util.AbstractMap; import java.util.Map; @@ -39,7 +41,7 @@ public sealed interface SealedResponseBody permits ApplicationxmlResponseBody, A public record ApplicationxmlResponseBody(ApplicationxmlSchema.StringJsonSchema1Boxed body) implements SealedResponseBody { } public record ApplicationjsonResponseBody(ApplicationjsonSchema.StringJsonSchema1Boxed body) implements SealedResponseBody { } - public static class Code200Response1 extends ResponseDeserializer { + public static class Code200Response1 extends ResponseDeserializer { public Code200Response1() { super( Map.ofEntries( @@ -66,8 +68,8 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { - return null; + protected HeadersSchema.HeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { + return new Headers().deserialize(headers, configuration); } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code400Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code400Response.java index 371b8704162..ff44cd75c14 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code400Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code400Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/delete/responses/Code404Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/delete/responses/Code404Response.java index 5fc5f8a0ebb..c456e073d08 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/delete/responses/Code404Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/delete/responses/Code404Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code200Response.java index 5e70bd5ebe9..3086e739dfb 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code200Response.java @@ -66,7 +66,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code400Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code400Response.java index 8755e292c0c..1612e8c8da1 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code400Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code400Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code404Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code404Response.java index 26d850cab81..7533ab39e11 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code404Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/responses/Code404Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/put/responses/Code400Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/put/responses/Code400Response.java index a19df3384c7..a9207b46b15 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/put/responses/Code400Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/put/responses/Code400Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/put/responses/Code404Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/put/responses/Code404Response.java index 708688d850a..6226880fa67 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/put/responses/Code404Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/put/responses/Code404Response.java @@ -26,7 +26,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java index ac60319675a..a79dd391b16 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java @@ -31,7 +31,7 @@ public ResponseDeserializer(Map content) { } protected abstract SealedBodyClass getBody(String contentType, byte[] body, SchemaConfiguration configuration); - protected abstract HeaderClass getHeaders(HttpHeaders headers); + protected abstract HeaderClass getHeaders(HttpHeaders headers, SchemaConfiguration configuration); protected @Nullable Object deserializeJson(byte[] body) { String bodyStr = new String(body, StandardCharsets.UTF_8); diff --git a/src/main/resources/java/src/main/java/packagename/components/responses/Response.hbs b/src/main/resources/java/src/main/java/packagename/components/responses/Response.hbs index b1cf695c070..6fc4e9b3745 100644 --- a/src/main/resources/java/src/main/java/packagename/components/responses/Response.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/responses/Response.hbs @@ -24,6 +24,12 @@ import {{packageName}}.schemas.validation.MapUtils; import {{{packageName}}}.{{subpackage}}.{{containerJsonPathPiece.pascalCase}}; {{/with}} {{/each}} + {{#with headersObjectSchema}} +import {{{packageName}}}.{{subpackage}}.{{containerJsonPathPiece.pascalCase}}; + {{/with}} + {{#if headers}} +import {{{packageName}}}.{{headers.subpackage}}.{{headers.jsonPathPiece.pascalCase}}; + {{/if}} {{#if content}} import java.util.AbstractMap; @@ -53,7 +59,7 @@ public class {{jsonPathPiece.pascalCase}} { {{/each}} {{/if}} - public static class {{jsonPathPiece.pascalCase}}1 extends ResponseDeserializer<{{#if hasContentSchema}}SealedResponseBody{{else}}Void{{/if}}, Void, {{#if hasContentSchema}}SealedMediaType{{else}}Void{{/if}}> { + public static class {{jsonPathPiece.pascalCase}}1 extends ResponseDeserializer<{{#if hasContentSchema}}SealedResponseBody{{else}}Void{{/if}}, {{#with headersObjectSchema}}{{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}}{{else}}Void{{/with}}, {{#if hasContentSchema}}SealedMediaType{{else}}Void{{/if}}> { public {{jsonPathPiece.pascalCase}}1() { super( {{#if hasContentSchema}} @@ -99,8 +105,12 @@ public class {{jsonPathPiece.pascalCase}} { {{/if}} @Override - protected Void getHeaders(HttpHeaders headers) { + protected {{#with headersObjectSchema}}{{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}}{{else}}Void{{/with}} getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { + {{#if headers}} + return new {{headers.jsonPathPiece.pascalCase}}().deserialize(headers, configuration); + {{else}} return null; + {{/if}} } } diff --git a/src/main/resources/java/src/main/java/packagename/response/HeadersDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/response/HeadersDeserializer.hbs index c7880fa57aa..94094d69974 100644 --- a/src/main/resources/java/src/main/java/packagename/response/HeadersDeserializer.hbs +++ b/src/main/resources/java/src/main/java/packagename/response/HeadersDeserializer.hbs @@ -24,6 +24,7 @@ public abstract class HeadersDeserializer { String headerName = entry.getKey(); Header headerDeserializer = headers.get(headerName); if (headerDeserializer == null) { + // todo put this data in headersToValidate, if only one item in list load it in, otherwise join them with commas continue; } @Nullable Object headerValue = headerDeserializer.deserialize(entry.getValue(), false, configuration); diff --git a/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs index c6c97c60591..f8be6339ad9 100644 --- a/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs +++ b/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs @@ -31,7 +31,7 @@ public abstract class ResponseDeserializer Date: Thu, 29 Feb 2024 23:00:02 -0800 Subject: [PATCH 22/32] Updates HeaderSchema to not collide when they are imprted into responses --- .../petstore/java/.openapi-generator/FILES | 8 +- .../headers/xexpiresafter/Schema200Schema.md | 49 ++ .../applicationjson/Schema200Schema.md | 49 ++ .../responses/HeadersWithNoBody.java | 6 +- .../SuccessInlineContentAndHeader.java | 6 +- .../responses/SuccessWithJsonApiResponse.java | 6 +- ...va => HeadersWithNoBodyHeadersSchema.java} | 58 +- .../{Headers.java => headers.java} | 4 +- ...sInlineContentAndHeaderHeadersSchema.java} | 58 +- .../{Headers.java => headers.java} | 4 +- .../HeadersSchema.java | 529 ------------------ ...ccessWithJsonApiResponseHeadersSchema.java | 529 ++++++++++++++++++ .../{Headers.java => headers.java} | 4 +- .../get/responses/Code200Response.java | 6 +- ...java => Code200ResponseHeadersSchema.java} | 164 +++--- .../{Headers.java => headers.java} | 4 +- .../client/response/HeadersDeserializer.java | 1 + .../generators/JavaClientGenerator.java | 21 +- 18 files changed, 808 insertions(+), 698 deletions(-) create mode 100644 samples/client/petstore/java/docs/paths/userlogin/get/responses/code200response/headers/xexpiresafter/Schema200Schema.md create mode 100644 samples/client/petstore/java/docs/paths/userlogin/get/responses/code200response/headers/xratelimit/content/applicationjson/Schema200Schema.md rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/{HeadersSchema.java => HeadersWithNoBodyHeadersSchema.java} (69%) rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/{Headers.java => headers.java} (70%) rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/{HeadersSchema.java => SuccessInlineContentAndHeaderHeadersSchema.java} (66%) rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/{Headers.java => headers.java} (67%) delete mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/HeadersSchema.java create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/SuccessWithJsonApiResponseHeadersSchema.java rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/{Headers.java => headers.java} (85%) rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/{HeadersSchema.java => Code200ResponseHeadersSchema.java} (55%) rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/{Headers.java => headers.java} (87%) diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 752c99f548c..1628bb4015c 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -359,18 +359,18 @@ src/main/java/org/openapijsonschematools/client/components/responses/SuccessDesc src/main/java/org/openapijsonschematools/client/components/responses/SuccessInlineContentAndHeader.java src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java src/main/java/org/openapijsonschematools/client/components/responses/SuccessfulXmlAndJsonArrayOfPet.java -src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersSchema.java +src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersWithNoBodyHeadersSchema.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/Location.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/location/LocationSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successfulxmlandjsonarrayofpet/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successfulxmlandjsonarrayofpet/content/applicationxml/ApplicationxmlSchema.java -src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/HeadersSchema.java +src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/SuccessInlineContentAndHeaderHeadersSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/SomeHeader.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/someheader/SomeHeaderSchema.java -src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/HeadersSchema.java +src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/SuccessWithJsonApiResponseHeadersSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Int32.java @@ -949,7 +949,7 @@ src/main/java/org/openapijsonschematools/client/paths/userlogin/get/parameters/p src/main/java/org/openapijsonschematools/client/paths/userlogin/get/parameters/parameter1/Schema1.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code400Response.java -src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/HeadersSchema.java +src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Code200ResponseHeadersSchema.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/content/applicationxml/ApplicationxmlSchema.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers.java diff --git a/samples/client/petstore/java/docs/paths/userlogin/get/responses/code200response/headers/xexpiresafter/Schema200Schema.md b/samples/client/petstore/java/docs/paths/userlogin/get/responses/code200response/headers/xexpiresafter/Schema200Schema.md new file mode 100644 index 00000000000..190f86e0058 --- /dev/null +++ b/samples/client/petstore/java/docs/paths/userlogin/get/responses/code200response/headers/xexpiresafter/Schema200Schema.md @@ -0,0 +1,49 @@ +# Schema200Schema +public class Schema200Schema
+ +A class that contains necessary nested +- schema classes (which validate payloads), extends JsonSchema +- sealed interfaces which store validated payloads, java version of a sum type +- boxed classes which store validated payloads, sealed permits class implementations + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | ---------------------- | +| sealed interface | [Schema200Schema.Schema200Schema1Boxed](#schema200schema1boxed)
sealed interface for validated payloads | +| record | [Schema200Schema.Schema200Schema1BoxedString](#schema200schema1boxedstring)
boxed class to store validated String payloads | +| static class | [Schema200Schema.Schema200Schema1](#schema200schema1)
schema class | + +## Schema200Schema1Boxed +public sealed interface Schema200Schema1Boxed
+permits
+[Schema200Schema1BoxedString](#schema200schema1boxedstring) + +sealed interface that stores validated payloads using boxed classes + +## Schema200Schema1BoxedString +public record Schema200Schema1BoxedString
+implements [Schema200Schema1Boxed](#schema200schema1boxed) + +record that stores validated String payloads, sealed permits implementation + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| Schema200Schema1BoxedString(String data)
Creates an instance, private visibility | + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| String | data()
validated payload | +| @Nullable Object | getData()
validated payload | + +## Schema200Schema1 +public static class Schema200Schema1
+extends DateTimeJsonSchema.DateTimeJsonSchema1 + +A schema class that validates payloads + +| Methods Inherited from class org.openapijsonschematools.client.schemas.DateTimeJsonSchema.DateTimeJsonSchema1 | +| ------------------------------------------------------------------ | +| validate | +| validateAndBox | diff --git a/samples/client/petstore/java/docs/paths/userlogin/get/responses/code200response/headers/xratelimit/content/applicationjson/Schema200Schema.md b/samples/client/petstore/java/docs/paths/userlogin/get/responses/code200response/headers/xratelimit/content/applicationjson/Schema200Schema.md new file mode 100644 index 00000000000..4bb062364ad --- /dev/null +++ b/samples/client/petstore/java/docs/paths/userlogin/get/responses/code200response/headers/xratelimit/content/applicationjson/Schema200Schema.md @@ -0,0 +1,49 @@ +# Schema200Schema +public class Schema200Schema
+ +A class that contains necessary nested +- schema classes (which validate payloads), extends JsonSchema +- sealed interfaces which store validated payloads, java version of a sum type +- boxed classes which store validated payloads, sealed permits class implementations + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | ---------------------- | +| sealed interface | [Schema200Schema.Schema200Schema1Boxed](#schema200schema1boxed)
sealed interface for validated payloads | +| record | [Schema200Schema.Schema200Schema1BoxedNumber](#schema200schema1boxednumber)
boxed class to store validated Number payloads | +| static class | [Schema200Schema.Schema200Schema1](#schema200schema1)
schema class | + +## Schema200Schema1Boxed +public sealed interface Schema200Schema1Boxed
+permits
+[Schema200Schema1BoxedNumber](#schema200schema1boxednumber) + +sealed interface that stores validated payloads using boxed classes + +## Schema200Schema1BoxedNumber +public record Schema200Schema1BoxedNumber
+implements [Schema200Schema1Boxed](#schema200schema1boxed) + +record that stores validated Number payloads, sealed permits implementation + +### Constructor Summary +| Constructor and Description | +| --------------------------- | +| Schema200Schema1BoxedNumber(Number data)
Creates an instance, private visibility | + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| Number | data()
validated payload | +| @Nullable Object | getData()
validated payload | + +## Schema200Schema1 +public static class Schema200Schema1
+extends Int32JsonSchema.Int32JsonSchema1 + +A schema class that validates payloads + +| Methods Inherited from class org.openapijsonschematools.client.schemas.Int32JsonSchema.Int32JsonSchema1 | +| ------------------------------------------------------------------ | +| validate | +| validateAndBox | diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/HeadersWithNoBody.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/HeadersWithNoBody.java index 0e0ef035f0f..3c5e23a79cb 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/HeadersWithNoBody.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/HeadersWithNoBody.java @@ -5,7 +5,7 @@ import org.openapijsonschematools.client.response.DeserializedHttpResponse; import org.openapijsonschematools.client.exceptions.ApiException; import org.openapijsonschematools.client.schemas.validation.MapUtils; -import org.openapijsonschematools.client.components.responses.headerswithnobody.HeadersSchema; +import org.openapijsonschematools.client.components.responses.headerswithnobody.HeadersWithNoBodyHeadersSchema; import org.openapijsonschematools.client.components.responses.headerswithnobody.Headers; import java.util.Map; @@ -14,7 +14,7 @@ public class HeadersWithNoBody { - public static class HeadersWithNoBody1 extends ResponseDeserializer { + public static class HeadersWithNoBody1 extends ResponseDeserializer { public HeadersWithNoBody1() { super( MapUtils.makeMap( @@ -28,7 +28,7 @@ protected Void getBody(String contentType, byte[] body, SchemaConfiguration conf } @Override - protected HeadersSchema.HeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { + protected HeadersWithNoBodyHeadersSchema.HeadersWithNoBodyHeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return new Headers().deserialize(headers, configuration); } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessInlineContentAndHeader.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessInlineContentAndHeader.java index e89ba927e4e..c1b9c74b65c 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessInlineContentAndHeader.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessInlineContentAndHeader.java @@ -6,7 +6,7 @@ import org.openapijsonschematools.client.exceptions.ApiException; import org.openapijsonschematools.client.mediatype.MediaType; import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.content.applicationjson.ApplicationjsonSchema; -import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.HeadersSchema; +import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.SuccessInlineContentAndHeaderHeadersSchema; import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.Headers; import java.util.AbstractMap; @@ -29,7 +29,7 @@ public Void encoding() { public sealed interface SealedResponseBody permits ApplicationjsonResponseBody {} public record ApplicationjsonResponseBody(ApplicationjsonSchema.ApplicationjsonSchema1Boxed body) implements SealedResponseBody { } - public static class SuccessInlineContentAndHeader1 extends ResponseDeserializer { + public static class SuccessInlineContentAndHeader1 extends ResponseDeserializer { public SuccessInlineContentAndHeader1() { super( Map.ofEntries( @@ -52,7 +52,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected HeadersSchema.HeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { + protected SuccessInlineContentAndHeaderHeadersSchema.SuccessInlineContentAndHeaderHeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return new Headers().deserialize(headers, configuration); } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java index 8adea2c6f84..61a2d19f509 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java @@ -6,7 +6,7 @@ import org.openapijsonschematools.client.exceptions.ApiException; import org.openapijsonschematools.client.mediatype.MediaType; import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.content.applicationjson.ApplicationjsonSchema; -import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.HeadersSchema; +import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.SuccessWithJsonApiResponseHeadersSchema; import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.Headers; import java.util.AbstractMap; @@ -29,7 +29,7 @@ public Void encoding() { public sealed interface SealedResponseBody permits ApplicationjsonResponseBody {} public record ApplicationjsonResponseBody(ApplicationjsonSchema.ApiResponseSchema1Boxed body) implements SealedResponseBody { } - public static class SuccessWithJsonApiResponse1 extends ResponseDeserializer { + public static class SuccessWithJsonApiResponse1 extends ResponseDeserializer { public SuccessWithJsonApiResponse1() { super( Map.ofEntries( @@ -52,7 +52,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected HeadersSchema.HeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { + protected SuccessWithJsonApiResponseHeadersSchema.SuccessWithJsonApiResponseHeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return new Headers().deserialize(headers, configuration); } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersWithNoBodyHeadersSchema.java similarity index 69% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersSchema.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersWithNoBodyHeadersSchema.java index 029c2445e6c..d0cbaf812f0 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersSchema.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersWithNoBodyHeadersSchema.java @@ -26,32 +26,32 @@ import org.openapijsonschematools.client.schemas.validation.PropertyEntry; import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; -public class HeadersSchema { +public class HeadersWithNoBodyHeadersSchema { // nest classes so all schemas and input/output classes can be public - public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { + public static class HeadersWithNoBodyAdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { // NotAnyTypeSchema - private static @Nullable AdditionalProperties instance = null; - public static AdditionalProperties getInstance() { + private static @Nullable HeadersWithNoBodyAdditionalProperties instance = null; + public static HeadersWithNoBodyAdditionalProperties getInstance() { if (instance == null) { - instance = new AdditionalProperties(); + instance = new HeadersWithNoBodyAdditionalProperties(); } return instance; } } - public static class HeadersSchemaMap extends FrozenMap { - protected HeadersSchemaMap(FrozenMap m) { + public static class HeadersWithNoBodyHeadersSchemaMap extends FrozenMap { + protected HeadersWithNoBodyHeadersSchemaMap(FrozenMap m) { super(m); } public static final Set requiredKeys = Set.of(); public static final Set optionalKeys = Set.of( "location" ); - public static HeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { - return HeadersSchema1.getInstance().validate(arg, configuration); + public static HeadersWithNoBodyHeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return HeadersWithNoBodyHeadersSchema1.getInstance().validate(arg, configuration); } public String location() throws UnsetPropertyException { @@ -59,18 +59,18 @@ public String location() throws UnsetPropertyException { } } - public interface SetterForLocation { + public interface SetterForHeadersWithNoBodyLocation { Map getInstance(); - T getBuilderAfterLocation(Map instance); + T getBuilderAfterHeadersWithNoBodyLocation(Map instance); default T location(String value) { var instance = getInstance(); instance.put("location", value); - return getBuilderAfterLocation(instance); + return getBuilderAfterHeadersWithNoBodyLocation(instance); } } - public static class HeadersSchemaMapBuilder implements GenericBuilder>, SetterForLocation { + public static class HeadersWithNoBodyHeadersSchemaMapBuilder implements GenericBuilder>, SetterForHeadersWithNoBodyLocation { private final Map instance; private static final Set knownKeys = Set.of( "location" @@ -78,7 +78,7 @@ public static class HeadersSchemaMapBuilder implements GenericBuilder getKnownKeys() { return knownKeys; } - public HeadersSchemaMapBuilder() { + public HeadersWithNoBodyHeadersSchemaMapBuilder() { this.instance = new LinkedHashMap<>(); } public Map build() { @@ -87,17 +87,17 @@ public Map build() { public Map getInstance() { return instance; } - public HeadersSchemaMapBuilder getBuilderAfterLocation(Map instance) { + public HeadersWithNoBodyHeadersSchemaMapBuilder getBuilderAfterHeadersWithNoBodyLocation(Map instance) { return this; } } - public sealed interface HeadersSchema1Boxed permits HeadersSchema1BoxedMap { + public sealed interface HeadersWithNoBodyHeadersSchema1Boxed permits HeadersWithNoBodyHeadersSchema1BoxedMap { @Nullable Object getData(); } - public record HeadersSchema1BoxedMap(HeadersSchemaMap data) implements HeadersSchema1Boxed { + public record HeadersWithNoBodyHeadersSchema1BoxedMap(HeadersWithNoBodyHeadersSchemaMap data) implements HeadersWithNoBodyHeadersSchema1Boxed { @Override public @Nullable Object getData() { return data; @@ -105,27 +105,27 @@ public record HeadersSchema1BoxedMap(HeadersSchemaMap data) implements HeadersSc } - public static class HeadersSchema1 extends JsonSchema implements MapSchemaValidator { - private static @Nullable HeadersSchema1 instance = null; + public static class HeadersWithNoBodyHeadersSchema1 extends JsonSchema implements MapSchemaValidator { + private static @Nullable HeadersWithNoBodyHeadersSchema1 instance = null; - protected HeadersSchema1() { + protected HeadersWithNoBodyHeadersSchema1() { super(new JsonSchemaInfo() .type(Set.of(Map.class)) .properties(Map.ofEntries( new PropertyEntry("location", LocationSchema.LocationSchema1.class) )) - .additionalProperties(AdditionalProperties.class) + .additionalProperties(HeadersWithNoBodyAdditionalProperties.class) ); } - public static HeadersSchema1 getInstance() { + public static HeadersWithNoBodyHeadersSchema1 getInstance() { if (instance == null) { - instance = new HeadersSchema1(); + instance = new HeadersWithNoBodyHeadersSchema1(); } return instance; } - public HeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + public HeadersWithNoBodyHeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { LinkedHashMap properties = new LinkedHashMap<>(); for(Map.Entry entry: arg.entrySet()) { @Nullable Object entryKey = entry.getKey(); @@ -148,10 +148,10 @@ public HeadersSchemaMap getNewInstance(Map arg, List pathToItem, P properties.put(propertyName, (String) propertyInstance); } FrozenMap castProperties = new FrozenMap<>(properties); - return new HeadersSchemaMap(castProperties); + return new HeadersWithNoBodyHeadersSchemaMap(castProperties); } - public HeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + public HeadersWithNoBodyHeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { Set> pathSet = new HashSet<>(); List pathToItem = List.of("args[0"); Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); @@ -177,11 +177,11 @@ public HeadersSchemaMap validate(Map arg, SchemaConfiguration configuratio throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); } @Override - public HeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - return new HeadersSchema1BoxedMap(validate(arg, configuration)); + public HeadersWithNoBodyHeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + return new HeadersWithNoBodyHeadersSchema1BoxedMap(validate(arg, configuration)); } @Override - public HeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + public HeadersWithNoBodyHeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { if (arg instanceof Map castArg) { return validateAndBox(castArg, configuration); } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers.java similarity index 70% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers.java index d3b7461f1ce..dacfb5ee075 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers.java @@ -6,13 +6,13 @@ import java.util.Map; import java.util.AbstractMap; -public class Headers extends HeadersDeserializer { +public class Headers extends HeadersDeserializer { public Headers() { super( Map.ofEntries( new AbstractMap.SimpleEntry<>("location", new Location.Location1()) ), - HeadersSchema.HeadersSchema1.getInstance() + HeadersWithNoBodyHeadersSchema.HeadersWithNoBodyHeadersSchema1.getInstance() ); } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/HeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/SuccessInlineContentAndHeaderHeadersSchema.java similarity index 66% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/HeadersSchema.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/SuccessInlineContentAndHeaderHeadersSchema.java index 5c0f23a75b1..227e14f64b5 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/HeadersSchema.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/SuccessInlineContentAndHeaderHeadersSchema.java @@ -26,32 +26,32 @@ import org.openapijsonschematools.client.schemas.validation.PropertyEntry; import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; -public class HeadersSchema { +public class SuccessInlineContentAndHeaderHeadersSchema { // nest classes so all schemas and input/output classes can be public - public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { + public static class SuccessInlineContentAndHeaderAdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { // NotAnyTypeSchema - private static @Nullable AdditionalProperties instance = null; - public static AdditionalProperties getInstance() { + private static @Nullable SuccessInlineContentAndHeaderAdditionalProperties instance = null; + public static SuccessInlineContentAndHeaderAdditionalProperties getInstance() { if (instance == null) { - instance = new AdditionalProperties(); + instance = new SuccessInlineContentAndHeaderAdditionalProperties(); } return instance; } } - public static class HeadersSchemaMap extends FrozenMap { - protected HeadersSchemaMap(FrozenMap m) { + public static class SuccessInlineContentAndHeaderHeadersSchemaMap extends FrozenMap { + protected SuccessInlineContentAndHeaderHeadersSchemaMap(FrozenMap m) { super(m); } public static final Set requiredKeys = Set.of(); public static final Set optionalKeys = Set.of( "someHeader" ); - public static HeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { - return HeadersSchema1.getInstance().validate(arg, configuration); + public static SuccessInlineContentAndHeaderHeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return SuccessInlineContentAndHeaderHeadersSchema1.getInstance().validate(arg, configuration); } public String someHeader() throws UnsetPropertyException { @@ -59,18 +59,18 @@ public String someHeader() throws UnsetPropertyException { } } - public interface SetterForSomeHeader { + public interface SetterForSuccessInlineContentAndHeaderSomeHeader { Map getInstance(); - T getBuilderAfterSomeHeader(Map instance); + T getBuilderAfterSuccessInlineContentAndHeaderSomeHeader(Map instance); default T someHeader(String value) { var instance = getInstance(); instance.put("someHeader", value); - return getBuilderAfterSomeHeader(instance); + return getBuilderAfterSuccessInlineContentAndHeaderSomeHeader(instance); } } - public static class HeadersSchemaMapBuilder implements GenericBuilder>, SetterForSomeHeader { + public static class SuccessInlineContentAndHeaderHeadersSchemaMapBuilder implements GenericBuilder>, SetterForSuccessInlineContentAndHeaderSomeHeader { private final Map instance; private static final Set knownKeys = Set.of( "someHeader" @@ -78,7 +78,7 @@ public static class HeadersSchemaMapBuilder implements GenericBuilder getKnownKeys() { return knownKeys; } - public HeadersSchemaMapBuilder() { + public SuccessInlineContentAndHeaderHeadersSchemaMapBuilder() { this.instance = new LinkedHashMap<>(); } public Map build() { @@ -87,17 +87,17 @@ public Map build() { public Map getInstance() { return instance; } - public HeadersSchemaMapBuilder getBuilderAfterSomeHeader(Map instance) { + public SuccessInlineContentAndHeaderHeadersSchemaMapBuilder getBuilderAfterSuccessInlineContentAndHeaderSomeHeader(Map instance) { return this; } } - public sealed interface HeadersSchema1Boxed permits HeadersSchema1BoxedMap { + public sealed interface SuccessInlineContentAndHeaderHeadersSchema1Boxed permits SuccessInlineContentAndHeaderHeadersSchema1BoxedMap { @Nullable Object getData(); } - public record HeadersSchema1BoxedMap(HeadersSchemaMap data) implements HeadersSchema1Boxed { + public record SuccessInlineContentAndHeaderHeadersSchema1BoxedMap(SuccessInlineContentAndHeaderHeadersSchemaMap data) implements SuccessInlineContentAndHeaderHeadersSchema1Boxed { @Override public @Nullable Object getData() { return data; @@ -105,27 +105,27 @@ public record HeadersSchema1BoxedMap(HeadersSchemaMap data) implements HeadersSc } - public static class HeadersSchema1 extends JsonSchema implements MapSchemaValidator { - private static @Nullable HeadersSchema1 instance = null; + public static class SuccessInlineContentAndHeaderHeadersSchema1 extends JsonSchema implements MapSchemaValidator { + private static @Nullable SuccessInlineContentAndHeaderHeadersSchema1 instance = null; - protected HeadersSchema1() { + protected SuccessInlineContentAndHeaderHeadersSchema1() { super(new JsonSchemaInfo() .type(Set.of(Map.class)) .properties(Map.ofEntries( new PropertyEntry("someHeader", SomeHeaderSchema.SomeHeaderSchema1.class) )) - .additionalProperties(AdditionalProperties.class) + .additionalProperties(SuccessInlineContentAndHeaderAdditionalProperties.class) ); } - public static HeadersSchema1 getInstance() { + public static SuccessInlineContentAndHeaderHeadersSchema1 getInstance() { if (instance == null) { - instance = new HeadersSchema1(); + instance = new SuccessInlineContentAndHeaderHeadersSchema1(); } return instance; } - public HeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + public SuccessInlineContentAndHeaderHeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { LinkedHashMap properties = new LinkedHashMap<>(); for(Map.Entry entry: arg.entrySet()) { @Nullable Object entryKey = entry.getKey(); @@ -148,10 +148,10 @@ public HeadersSchemaMap getNewInstance(Map arg, List pathToItem, P properties.put(propertyName, (String) propertyInstance); } FrozenMap castProperties = new FrozenMap<>(properties); - return new HeadersSchemaMap(castProperties); + return new SuccessInlineContentAndHeaderHeadersSchemaMap(castProperties); } - public HeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + public SuccessInlineContentAndHeaderHeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { Set> pathSet = new HashSet<>(); List pathToItem = List.of("args[0"); Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); @@ -177,11 +177,11 @@ public HeadersSchemaMap validate(Map arg, SchemaConfiguration configuratio throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); } @Override - public HeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - return new HeadersSchema1BoxedMap(validate(arg, configuration)); + public SuccessInlineContentAndHeaderHeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + return new SuccessInlineContentAndHeaderHeadersSchema1BoxedMap(validate(arg, configuration)); } @Override - public HeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + public SuccessInlineContentAndHeaderHeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { if (arg instanceof Map castArg) { return validateAndBox(castArg, configuration); } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers.java similarity index 67% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers.java index 209ab12a240..dece46b982e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers.java @@ -6,13 +6,13 @@ import java.util.Map; import java.util.AbstractMap; -public class Headers extends HeadersDeserializer { +public class Headers extends HeadersDeserializer { public Headers() { super( Map.ofEntries( new AbstractMap.SimpleEntry<>("someHeader", new SomeHeader.SomeHeader1()) ), - HeadersSchema.HeadersSchema1.getInstance() + SuccessInlineContentAndHeaderHeadersSchema.SuccessInlineContentAndHeaderHeadersSchema1.getInstance() ); } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/HeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/HeadersSchema.java deleted file mode 100644 index 04f733cce5b..00000000000 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/HeadersSchema.java +++ /dev/null @@ -1,529 +0,0 @@ -package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.openapijsonschematools.client.components.headers.int32jsoncontenttypeheader.content.applicationjson.Int32JsonContentTypeHeaderSchema; -import org.openapijsonschematools.client.components.headers.numberheader.NumberHeaderSchema; -import org.openapijsonschematools.client.components.headers.stringheader.StringHeaderSchema; -import org.openapijsonschematools.client.components.schemas.StringWithValidation; -import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; -import org.openapijsonschematools.client.configurations.SchemaConfiguration; -import org.openapijsonschematools.client.exceptions.InvalidTypeException; -import org.openapijsonschematools.client.exceptions.UnsetPropertyException; -import org.openapijsonschematools.client.exceptions.ValidationException; -import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; -import org.openapijsonschematools.client.schemas.GenericBuilder; -import org.openapijsonschematools.client.schemas.NotAnyTypeJsonSchema; -import org.openapijsonschematools.client.schemas.validation.FrozenMap; -import org.openapijsonschematools.client.schemas.validation.JsonSchema; -import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; -import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; -import org.openapijsonschematools.client.schemas.validation.MapUtils; -import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; -import org.openapijsonschematools.client.schemas.validation.PropertyEntry; -import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; - -public class HeadersSchema { - // nest classes so all schemas and input/output classes can be public - - - public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { - // NotAnyTypeSchema - private static @Nullable AdditionalProperties instance = null; - public static AdditionalProperties getInstance() { - if (instance == null) { - instance = new AdditionalProperties(); - } - return instance; - } - } - - - public static class HeadersSchemaMap extends FrozenMap<@Nullable Object> { - protected HeadersSchemaMap(FrozenMap<@Nullable Object> m) { - super(m); - } - public static final Set requiredKeys = Set.of( - "int32", - "ref-content-schema-header", - "ref-schema-header", - "stringHeader" - ); - public static final Set optionalKeys = Set.of( - "numberHeader" - ); - public static HeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { - return HeadersSchema1.getInstance().validate(arg, configuration); - } - - public Number int32() { - @Nullable Object value = get("int32"); - if (!(value instanceof Number)) { - throw new InvalidTypeException("Invalid value stored for int32"); - } - return (Number) value; - } - - public String stringHeader() { - @Nullable Object value = get("stringHeader"); - if (!(value instanceof String)) { - throw new InvalidTypeException("Invalid value stored for stringHeader"); - } - return (String) value; - } - - public String numberHeader() throws UnsetPropertyException { - String key = "numberHeader"; - throwIfKeyNotPresent(key); - @Nullable Object value = get(key); - if (!(value instanceof String)) { - throw new InvalidTypeException("Invalid value stored for numberHeader"); - } - return (String) value; - } - } - - public interface SetterForInt32 { - Map getInstance(); - T getBuilderAfterInt32(Map instance); - - default T int32(int value) { - var instance = getInstance(); - instance.put("int32", value); - return getBuilderAfterInt32(instance); - } - - default T int32(float value) { - var instance = getInstance(); - instance.put("int32", value); - return getBuilderAfterInt32(instance); - } - } - - public interface SetterForRefcontentschemaheader { - Map getInstance(); - T getBuilderAfterRefcontentschemaheader(Map instance); - - default T setRefHyphenMinusContentHyphenMinusSchemaHyphenMinusHeader(String value) { - var instance = getInstance(); - instance.put("ref-content-schema-header", value); - return getBuilderAfterRefcontentschemaheader(instance); - } - } - - public interface SetterForRefschemaheader { - Map getInstance(); - T getBuilderAfterRefschemaheader(Map instance); - - default T setRefHyphenMinusSchemaHyphenMinusHeader(String value) { - var instance = getInstance(); - instance.put("ref-schema-header", value); - return getBuilderAfterRefschemaheader(instance); - } - } - - public interface SetterForStringHeader { - Map getInstance(); - T getBuilderAfterStringHeader(Map instance); - - default T stringHeader(String value) { - var instance = getInstance(); - instance.put("stringHeader", value); - return getBuilderAfterStringHeader(instance); - } - } - - public interface SetterForNumberHeader { - Map getInstance(); - T getBuilderAfterNumberHeader(Map instance); - - default T numberHeader(String value) { - var instance = getInstance(); - instance.put("numberHeader", value); - return getBuilderAfterNumberHeader(instance); - } - } - - public static class HeadersSchemaMap0000Builder implements GenericBuilder>, SetterForNumberHeader { - private final Map instance; - private static final Set knownKeys = Set.of( - "int32", - "ref-content-schema-header", - "ref-schema-header", - "stringHeader", - "numberHeader" - ); - public Set getKnownKeys() { - return knownKeys; - } - public HeadersSchemaMap0000Builder(Map instance) { - this.instance = instance; - } - public Map build() { - return instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0000Builder getBuilderAfterNumberHeader(Map instance) { - return this; - } - } - - public static class HeadersSchemaMap0001Builder implements SetterForStringHeader { - private final Map instance; - public HeadersSchemaMap0001Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0000Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersSchemaMap0000Builder(instance); - } - } - - public static class HeadersSchemaMap0010Builder implements SetterForRefschemaheader { - private final Map instance; - public HeadersSchemaMap0010Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0000Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersSchemaMap0000Builder(instance); - } - } - - public static class HeadersSchemaMap0011Builder implements SetterForRefschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersSchemaMap0011Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0001Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersSchemaMap0001Builder(instance); - } - public HeadersSchemaMap0010Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersSchemaMap0010Builder(instance); - } - } - - public static class HeadersSchemaMap0100Builder implements SetterForRefcontentschemaheader { - private final Map instance; - public HeadersSchemaMap0100Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0000Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap0000Builder(instance); - } - } - - public static class HeadersSchemaMap0101Builder implements SetterForRefcontentschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersSchemaMap0101Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0001Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap0001Builder(instance); - } - public HeadersSchemaMap0100Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersSchemaMap0100Builder(instance); - } - } - - public static class HeadersSchemaMap0110Builder implements SetterForRefcontentschemaheader, SetterForRefschemaheader { - private final Map instance; - public HeadersSchemaMap0110Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0010Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap0010Builder(instance); - } - public HeadersSchemaMap0100Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersSchemaMap0100Builder(instance); - } - } - - public static class HeadersSchemaMap0111Builder implements SetterForRefcontentschemaheader, SetterForRefschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersSchemaMap0111Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0011Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap0011Builder(instance); - } - public HeadersSchemaMap0101Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersSchemaMap0101Builder(instance); - } - public HeadersSchemaMap0110Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersSchemaMap0110Builder(instance); - } - } - - public static class HeadersSchemaMap1000Builder implements SetterForInt32 { - private final Map instance; - public HeadersSchemaMap1000Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0000Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap0000Builder(instance); - } - } - - public static class HeadersSchemaMap1001Builder implements SetterForInt32, SetterForStringHeader { - private final Map instance; - public HeadersSchemaMap1001Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0001Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap0001Builder(instance); - } - public HeadersSchemaMap1000Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersSchemaMap1000Builder(instance); - } - } - - public static class HeadersSchemaMap1010Builder implements SetterForInt32, SetterForRefschemaheader { - private final Map instance; - public HeadersSchemaMap1010Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0010Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap0010Builder(instance); - } - public HeadersSchemaMap1000Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersSchemaMap1000Builder(instance); - } - } - - public static class HeadersSchemaMap1011Builder implements SetterForInt32, SetterForRefschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersSchemaMap1011Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0011Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap0011Builder(instance); - } - public HeadersSchemaMap1001Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersSchemaMap1001Builder(instance); - } - public HeadersSchemaMap1010Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersSchemaMap1010Builder(instance); - } - } - - public static class HeadersSchemaMap1100Builder implements SetterForInt32, SetterForRefcontentschemaheader { - private final Map instance; - public HeadersSchemaMap1100Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0100Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap0100Builder(instance); - } - public HeadersSchemaMap1000Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap1000Builder(instance); - } - } - - public static class HeadersSchemaMap1101Builder implements SetterForInt32, SetterForRefcontentschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersSchemaMap1101Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0101Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap0101Builder(instance); - } - public HeadersSchemaMap1001Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap1001Builder(instance); - } - public HeadersSchemaMap1100Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersSchemaMap1100Builder(instance); - } - } - - public static class HeadersSchemaMap1110Builder implements SetterForInt32, SetterForRefcontentschemaheader, SetterForRefschemaheader { - private final Map instance; - public HeadersSchemaMap1110Builder(Map instance) { - this.instance = instance; - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0110Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap0110Builder(instance); - } - public HeadersSchemaMap1010Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap1010Builder(instance); - } - public HeadersSchemaMap1100Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersSchemaMap1100Builder(instance); - } - } - - public static class HeadersSchemaMapBuilder implements SetterForInt32, SetterForRefcontentschemaheader, SetterForRefschemaheader, SetterForStringHeader { - private final Map instance; - public HeadersSchemaMapBuilder() { - this.instance = new LinkedHashMap<>(); - } - public Map getInstance() { - return instance; - } - public HeadersSchemaMap0111Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap0111Builder(instance); - } - public HeadersSchemaMap1011Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap1011Builder(instance); - } - public HeadersSchemaMap1101Builder getBuilderAfterRefschemaheader(Map instance) { - return new HeadersSchemaMap1101Builder(instance); - } - public HeadersSchemaMap1110Builder getBuilderAfterStringHeader(Map instance) { - return new HeadersSchemaMap1110Builder(instance); - } - } - - - public sealed interface HeadersSchema1Boxed permits HeadersSchema1BoxedMap { - @Nullable Object getData(); - } - - public record HeadersSchema1BoxedMap(HeadersSchemaMap data) implements HeadersSchema1Boxed { - @Override - public @Nullable Object getData() { - return data; - } - } - - - public static class HeadersSchema1 extends JsonSchema implements MapSchemaValidator { - private static @Nullable HeadersSchema1 instance = null; - - protected HeadersSchema1() { - super(new JsonSchemaInfo() - .type(Set.of(Map.class)) - .properties(Map.ofEntries( - new PropertyEntry("ref-schema-header", StringWithValidation.StringWithValidation1.class), - new PropertyEntry("int32", Int32JsonContentTypeHeaderSchema.Int32JsonContentTypeHeaderSchema1.class), - new PropertyEntry("ref-content-schema-header", StringWithValidation.StringWithValidation1.class), - new PropertyEntry("stringHeader", StringHeaderSchema.StringHeaderSchema1.class), - new PropertyEntry("numberHeader", NumberHeaderSchema.NumberHeaderSchema1.class) - )) - .required(Set.of( - "int32", - "ref-content-schema-header", - "ref-schema-header", - "stringHeader" - )) - .additionalProperties(AdditionalProperties.class) - ); - } - - public static HeadersSchema1 getInstance() { - if (instance == null) { - instance = new HeadersSchema1(); - } - return instance; - } - - public HeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { - LinkedHashMap properties = new LinkedHashMap<>(); - for(Map.Entry entry: arg.entrySet()) { - @Nullable Object entryKey = entry.getKey(); - if (!(entryKey instanceof String)) { - throw new InvalidTypeException("Invalid non-string key value"); - } - String propertyName = (String) entryKey; - List propertyPathToItem = new ArrayList<>(pathToItem); - propertyPathToItem.add(propertyName); - Object value = entry.getValue(); - LinkedHashMap, Void> schemas = pathToSchemas.get(propertyPathToItem); - if (schemas == null) { - throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); - } - JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); - @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); - properties.put(propertyName, propertyInstance); - } - FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); - return new HeadersSchemaMap(castProperties); - } - - public HeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - Set> pathSet = new HashSet<>(); - List pathToItem = List.of("args[0"); - Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); - SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); - ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); - PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); - return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); - } - - - @Override - public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - if (arg instanceof Map) { - return validate((Map) arg, configuration); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); - } - @Override - public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { - if (arg instanceof Map) { - return getNewInstance((Map) arg, pathToItem, pathToSchemas); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); - } - @Override - public HeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - return new HeadersSchema1BoxedMap(validate(arg, configuration)); - } - @Override - public HeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - if (arg instanceof Map castArg) { - return validateAndBox(castArg, configuration); - } - throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); - } - } - -} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/SuccessWithJsonApiResponseHeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/SuccessWithJsonApiResponseHeadersSchema.java new file mode 100644 index 00000000000..932f074cd3e --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/SuccessWithJsonApiResponseHeadersSchema.java @@ -0,0 +1,529 @@ +package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.components.headers.int32jsoncontenttypeheader.content.applicationjson.Int32JsonContentTypeHeaderSchema; +import org.openapijsonschematools.client.components.headers.numberheader.NumberHeaderSchema; +import org.openapijsonschematools.client.components.headers.stringheader.StringHeaderSchema; +import org.openapijsonschematools.client.components.schemas.StringWithValidation; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.exceptions.UnsetPropertyException; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.GenericBuilder; +import org.openapijsonschematools.client.schemas.NotAnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.validation.FrozenMap; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaInfo; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; +import org.openapijsonschematools.client.schemas.validation.MapUtils; +import org.openapijsonschematools.client.schemas.validation.PathToSchemasMap; +import org.openapijsonschematools.client.schemas.validation.PropertyEntry; +import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; + +public class SuccessWithJsonApiResponseHeadersSchema { + // nest classes so all schemas and input/output classes can be public + + + public static class SuccessWithJsonApiResponseAdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { + // NotAnyTypeSchema + private static @Nullable SuccessWithJsonApiResponseAdditionalProperties instance = null; + public static SuccessWithJsonApiResponseAdditionalProperties getInstance() { + if (instance == null) { + instance = new SuccessWithJsonApiResponseAdditionalProperties(); + } + return instance; + } + } + + + public static class SuccessWithJsonApiResponseHeadersSchemaMap extends FrozenMap<@Nullable Object> { + protected SuccessWithJsonApiResponseHeadersSchemaMap(FrozenMap<@Nullable Object> m) { + super(m); + } + public static final Set requiredKeys = Set.of( + "int32", + "ref-content-schema-header", + "ref-schema-header", + "stringHeader" + ); + public static final Set optionalKeys = Set.of( + "numberHeader" + ); + public static SuccessWithJsonApiResponseHeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return SuccessWithJsonApiResponseHeadersSchema1.getInstance().validate(arg, configuration); + } + + public Number int32() { + @Nullable Object value = get("int32"); + if (!(value instanceof Number)) { + throw new InvalidTypeException("Invalid value stored for int32"); + } + return (Number) value; + } + + public String stringHeader() { + @Nullable Object value = get("stringHeader"); + if (!(value instanceof String)) { + throw new InvalidTypeException("Invalid value stored for stringHeader"); + } + return (String) value; + } + + public String numberHeader() throws UnsetPropertyException { + String key = "numberHeader"; + throwIfKeyNotPresent(key); + @Nullable Object value = get(key); + if (!(value instanceof String)) { + throw new InvalidTypeException("Invalid value stored for numberHeader"); + } + return (String) value; + } + } + + public interface SetterForSuccessWithJsonApiResponseInt32 { + Map getInstance(); + T getBuilderAfterSuccessWithJsonApiResponseInt32(Map instance); + + default T int32(int value) { + var instance = getInstance(); + instance.put("int32", value); + return getBuilderAfterSuccessWithJsonApiResponseInt32(instance); + } + + default T int32(float value) { + var instance = getInstance(); + instance.put("int32", value); + return getBuilderAfterSuccessWithJsonApiResponseInt32(instance); + } + } + + public interface SetterForSuccessWithJsonApiResponseRefcontentschemaheader { + Map getInstance(); + T getBuilderAfterSuccessWithJsonApiResponseRefcontentschemaheader(Map instance); + + default T setRefHyphenMinusContentHyphenMinusSchemaHyphenMinusHeader(String value) { + var instance = getInstance(); + instance.put("ref-content-schema-header", value); + return getBuilderAfterSuccessWithJsonApiResponseRefcontentschemaheader(instance); + } + } + + public interface SetterForSuccessWithJsonApiResponseRefschemaheader { + Map getInstance(); + T getBuilderAfterSuccessWithJsonApiResponseRefschemaheader(Map instance); + + default T setRefHyphenMinusSchemaHyphenMinusHeader(String value) { + var instance = getInstance(); + instance.put("ref-schema-header", value); + return getBuilderAfterSuccessWithJsonApiResponseRefschemaheader(instance); + } + } + + public interface SetterForSuccessWithJsonApiResponseStringHeader { + Map getInstance(); + T getBuilderAfterSuccessWithJsonApiResponseStringHeader(Map instance); + + default T stringHeader(String value) { + var instance = getInstance(); + instance.put("stringHeader", value); + return getBuilderAfterSuccessWithJsonApiResponseStringHeader(instance); + } + } + + public interface SetterForSuccessWithJsonApiResponseNumberHeader { + Map getInstance(); + T getBuilderAfterSuccessWithJsonApiResponseNumberHeader(Map instance); + + default T numberHeader(String value) { + var instance = getInstance(); + instance.put("numberHeader", value); + return getBuilderAfterSuccessWithJsonApiResponseNumberHeader(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap0000Builder implements GenericBuilder>, SetterForSuccessWithJsonApiResponseNumberHeader { + private final Map instance; + private static final Set knownKeys = Set.of( + "int32", + "ref-content-schema-header", + "ref-schema-header", + "stringHeader", + "numberHeader" + ); + public Set getKnownKeys() { + return knownKeys; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0000Builder(Map instance) { + this.instance = instance; + } + public Map build() { + return instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0000Builder getBuilderAfterSuccessWithJsonApiResponseNumberHeader(Map instance) { + return this; + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap0001Builder implements SetterForSuccessWithJsonApiResponseStringHeader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap0001Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0000Builder getBuilderAfterSuccessWithJsonApiResponseStringHeader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0000Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap0010Builder implements SetterForSuccessWithJsonApiResponseRefschemaheader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap0010Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0000Builder getBuilderAfterSuccessWithJsonApiResponseRefschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0000Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap0011Builder implements SetterForSuccessWithJsonApiResponseRefschemaheader, SetterForSuccessWithJsonApiResponseStringHeader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap0011Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0001Builder getBuilderAfterSuccessWithJsonApiResponseRefschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0001Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap0010Builder getBuilderAfterSuccessWithJsonApiResponseStringHeader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0010Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap0100Builder implements SetterForSuccessWithJsonApiResponseRefcontentschemaheader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap0100Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0000Builder getBuilderAfterSuccessWithJsonApiResponseRefcontentschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0000Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap0101Builder implements SetterForSuccessWithJsonApiResponseRefcontentschemaheader, SetterForSuccessWithJsonApiResponseStringHeader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap0101Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0001Builder getBuilderAfterSuccessWithJsonApiResponseRefcontentschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0001Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap0100Builder getBuilderAfterSuccessWithJsonApiResponseStringHeader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0100Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap0110Builder implements SetterForSuccessWithJsonApiResponseRefcontentschemaheader, SetterForSuccessWithJsonApiResponseRefschemaheader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap0110Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0010Builder getBuilderAfterSuccessWithJsonApiResponseRefcontentschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0010Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap0100Builder getBuilderAfterSuccessWithJsonApiResponseRefschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0100Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap0111Builder implements SetterForSuccessWithJsonApiResponseRefcontentschemaheader, SetterForSuccessWithJsonApiResponseRefschemaheader, SetterForSuccessWithJsonApiResponseStringHeader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap0111Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0011Builder getBuilderAfterSuccessWithJsonApiResponseRefcontentschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0011Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap0101Builder getBuilderAfterSuccessWithJsonApiResponseRefschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0101Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap0110Builder getBuilderAfterSuccessWithJsonApiResponseStringHeader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0110Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap1000Builder implements SetterForSuccessWithJsonApiResponseInt32 { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap1000Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0000Builder getBuilderAfterSuccessWithJsonApiResponseInt32(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0000Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap1001Builder implements SetterForSuccessWithJsonApiResponseInt32, SetterForSuccessWithJsonApiResponseStringHeader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap1001Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0001Builder getBuilderAfterSuccessWithJsonApiResponseInt32(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0001Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1000Builder getBuilderAfterSuccessWithJsonApiResponseStringHeader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1000Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap1010Builder implements SetterForSuccessWithJsonApiResponseInt32, SetterForSuccessWithJsonApiResponseRefschemaheader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap1010Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0010Builder getBuilderAfterSuccessWithJsonApiResponseInt32(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0010Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1000Builder getBuilderAfterSuccessWithJsonApiResponseRefschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1000Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap1011Builder implements SetterForSuccessWithJsonApiResponseInt32, SetterForSuccessWithJsonApiResponseRefschemaheader, SetterForSuccessWithJsonApiResponseStringHeader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap1011Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0011Builder getBuilderAfterSuccessWithJsonApiResponseInt32(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0011Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1001Builder getBuilderAfterSuccessWithJsonApiResponseRefschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1001Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1010Builder getBuilderAfterSuccessWithJsonApiResponseStringHeader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1010Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap1100Builder implements SetterForSuccessWithJsonApiResponseInt32, SetterForSuccessWithJsonApiResponseRefcontentschemaheader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap1100Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0100Builder getBuilderAfterSuccessWithJsonApiResponseInt32(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0100Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1000Builder getBuilderAfterSuccessWithJsonApiResponseRefcontentschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1000Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap1101Builder implements SetterForSuccessWithJsonApiResponseInt32, SetterForSuccessWithJsonApiResponseRefcontentschemaheader, SetterForSuccessWithJsonApiResponseStringHeader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap1101Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0101Builder getBuilderAfterSuccessWithJsonApiResponseInt32(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0101Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1001Builder getBuilderAfterSuccessWithJsonApiResponseRefcontentschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1001Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1100Builder getBuilderAfterSuccessWithJsonApiResponseStringHeader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1100Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMap1110Builder implements SetterForSuccessWithJsonApiResponseInt32, SetterForSuccessWithJsonApiResponseRefcontentschemaheader, SetterForSuccessWithJsonApiResponseRefschemaheader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMap1110Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0110Builder getBuilderAfterSuccessWithJsonApiResponseInt32(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0110Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1010Builder getBuilderAfterSuccessWithJsonApiResponseRefcontentschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1010Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1100Builder getBuilderAfterSuccessWithJsonApiResponseRefschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1100Builder(instance); + } + } + + public static class SuccessWithJsonApiResponseHeadersSchemaMapBuilder implements SetterForSuccessWithJsonApiResponseInt32, SetterForSuccessWithJsonApiResponseRefcontentschemaheader, SetterForSuccessWithJsonApiResponseRefschemaheader, SetterForSuccessWithJsonApiResponseStringHeader { + private final Map instance; + public SuccessWithJsonApiResponseHeadersSchemaMapBuilder() { + this.instance = new LinkedHashMap<>(); + } + public Map getInstance() { + return instance; + } + public SuccessWithJsonApiResponseHeadersSchemaMap0111Builder getBuilderAfterSuccessWithJsonApiResponseInt32(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap0111Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1011Builder getBuilderAfterSuccessWithJsonApiResponseRefcontentschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1011Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1101Builder getBuilderAfterSuccessWithJsonApiResponseRefschemaheader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1101Builder(instance); + } + public SuccessWithJsonApiResponseHeadersSchemaMap1110Builder getBuilderAfterSuccessWithJsonApiResponseStringHeader(Map instance) { + return new SuccessWithJsonApiResponseHeadersSchemaMap1110Builder(instance); + } + } + + + public sealed interface SuccessWithJsonApiResponseHeadersSchema1Boxed permits SuccessWithJsonApiResponseHeadersSchema1BoxedMap { + @Nullable Object getData(); + } + + public record SuccessWithJsonApiResponseHeadersSchema1BoxedMap(SuccessWithJsonApiResponseHeadersSchemaMap data) implements SuccessWithJsonApiResponseHeadersSchema1Boxed { + @Override + public @Nullable Object getData() { + return data; + } + } + + + public static class SuccessWithJsonApiResponseHeadersSchema1 extends JsonSchema implements MapSchemaValidator { + private static @Nullable SuccessWithJsonApiResponseHeadersSchema1 instance = null; + + protected SuccessWithJsonApiResponseHeadersSchema1() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("ref-schema-header", StringWithValidation.StringWithValidation1.class), + new PropertyEntry("int32", Int32JsonContentTypeHeaderSchema.Int32JsonContentTypeHeaderSchema1.class), + new PropertyEntry("ref-content-schema-header", StringWithValidation.StringWithValidation1.class), + new PropertyEntry("stringHeader", StringHeaderSchema.StringHeaderSchema1.class), + new PropertyEntry("numberHeader", NumberHeaderSchema.NumberHeaderSchema1.class) + )) + .required(Set.of( + "int32", + "ref-content-schema-header", + "ref-schema-header", + "stringHeader" + )) + .additionalProperties(SuccessWithJsonApiResponseAdditionalProperties.class) + ); + } + + public static SuccessWithJsonApiResponseHeadersSchema1 getInstance() { + if (instance == null) { + instance = new SuccessWithJsonApiResponseHeadersSchema1(); + } + return instance; + } + + public SuccessWithJsonApiResponseHeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + LinkedHashMap properties = new LinkedHashMap<>(); + for(Map.Entry entry: arg.entrySet()) { + @Nullable Object entryKey = entry.getKey(); + if (!(entryKey instanceof String)) { + throw new InvalidTypeException("Invalid non-string key value"); + } + String propertyName = (String) entryKey; + List propertyPathToItem = new ArrayList<>(pathToItem); + propertyPathToItem.add(propertyName); + Object value = entry.getValue(); + LinkedHashMap, Void> schemas = pathToSchemas.get(propertyPathToItem); + if (schemas == null) { + throw new InvalidTypeException("Validation result is invalid, schemas must exist for a pathToItem"); + } + JsonSchema propertySchema = schemas.entrySet().iterator().next().getKey(); + @Nullable Object propertyInstance = propertySchema.getNewInstance(value, propertyPathToItem, pathToSchemas); + properties.put(propertyName, propertyInstance); + } + FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); + return new SuccessWithJsonApiResponseHeadersSchemaMap(castProperties); + } + + public SuccessWithJsonApiResponseHeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + Set> pathSet = new HashSet<>(); + List pathToItem = List.of("args[0"); + Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); + SchemaConfiguration usedConfiguration = Objects.requireNonNullElseGet(configuration, () -> new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone())); + ValidationMetadata validationMetadata = new ValidationMetadata(pathToItem, usedConfiguration, new PathToSchemasMap(), new LinkedHashSet<>()); + PathToSchemasMap pathToSchemasMap = getPathToSchemas(this, castArg, validationMetadata, pathSet); + return getNewInstance(castArg, validationMetadata.pathToItem(), pathToSchemasMap); + } + + + @Override + public @Nullable Object validate(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof Map) { + return validate((Map) arg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + @Override + public @Nullable Object getNewInstance(@Nullable Object arg, List pathToItem, PathToSchemasMap pathToSchemas) throws InvalidTypeException { + if (arg instanceof Map) { + return getNewInstance((Map) arg, pathToItem, pathToSchemas); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); + } + @Override + public SuccessWithJsonApiResponseHeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + return new SuccessWithJsonApiResponseHeadersSchema1BoxedMap(validate(arg, configuration)); + } + @Override + public SuccessWithJsonApiResponseHeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + if (arg instanceof Map castArg) { + return validateAndBox(castArg, configuration); + } + throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be validated by this schema"); + } + } + +} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers.java similarity index 85% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers.java index 41a13b7936b..d762e053d69 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers.java @@ -10,7 +10,7 @@ import java.util.Map; import java.util.AbstractMap; -public class Headers extends HeadersDeserializer { +public class Headers extends HeadersDeserializer { public Headers() { super( Map.ofEntries( @@ -20,7 +20,7 @@ public Headers() { new AbstractMap.SimpleEntry<>("stringHeader", new StringHeader.StringHeader1()), new AbstractMap.SimpleEntry<>("numberHeader", new NumberHeader.NumberHeader1()) ), - HeadersSchema.HeadersSchema1.getInstance() + SuccessWithJsonApiResponseHeadersSchema.SuccessWithJsonApiResponseHeadersSchema1.getInstance() ); } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java index 2851c02a22c..fc6f3fd1454 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java @@ -7,7 +7,7 @@ import org.openapijsonschematools.client.mediatype.MediaType; import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.content.applicationxml.ApplicationxmlSchema; import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.content.applicationjson.ApplicationjsonSchema; -import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.HeadersSchema; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.Code200ResponseHeadersSchema; import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.Headers; import java.util.AbstractMap; @@ -41,7 +41,7 @@ public sealed interface SealedResponseBody permits ApplicationxmlResponseBody, A public record ApplicationxmlResponseBody(ApplicationxmlSchema.StringJsonSchema1Boxed body) implements SealedResponseBody { } public record ApplicationjsonResponseBody(ApplicationjsonSchema.StringJsonSchema1Boxed body) implements SealedResponseBody { } - public static class Code200Response1 extends ResponseDeserializer { + public static class Code200Response1 extends ResponseDeserializer { public Code200Response1() { super( Map.ofEntries( @@ -68,7 +68,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected HeadersSchema.HeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { + protected Code200ResponseHeadersSchema.Code200ResponseHeadersSchemaMap getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return new Headers().deserialize(headers, configuration); } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/HeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Code200ResponseHeadersSchema.java similarity index 55% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/HeadersSchema.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Code200ResponseHeadersSchema.java index c7a87c29d3d..a1cff258337 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/HeadersSchema.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Code200ResponseHeadersSchema.java @@ -30,24 +30,24 @@ import org.openapijsonschematools.client.schemas.validation.PropertyEntry; import org.openapijsonschematools.client.schemas.validation.ValidationMetadata; -public class HeadersSchema { +public class Code200ResponseHeadersSchema { // nest classes so all schemas and input/output classes can be public - public static class AdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { + public static class Code200ResponseAdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { // NotAnyTypeSchema - private static @Nullable AdditionalProperties instance = null; - public static AdditionalProperties getInstance() { + private static @Nullable Code200ResponseAdditionalProperties instance = null; + public static Code200ResponseAdditionalProperties getInstance() { if (instance == null) { - instance = new AdditionalProperties(); + instance = new Code200ResponseAdditionalProperties(); } return instance; } } - public static class HeadersSchemaMap extends FrozenMap<@Nullable Object> { - protected HeadersSchemaMap(FrozenMap<@Nullable Object> m) { + public static class Code200ResponseHeadersSchemaMap extends FrozenMap<@Nullable Object> { + protected Code200ResponseHeadersSchemaMap(FrozenMap<@Nullable Object> m) { super(m); } public static final Set requiredKeys = Set.of( @@ -59,8 +59,8 @@ protected HeadersSchemaMap(FrozenMap<@Nullable Object> m) { "X-Expires-After", "numberHeader" ); - public static HeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { - return HeadersSchema1.getInstance().validate(arg, configuration); + public static Code200ResponseHeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return Code200ResponseHeadersSchema1.getInstance().validate(arg, configuration); } public Number int32() { @@ -82,74 +82,74 @@ public String numberHeader() throws UnsetPropertyException { } } - public interface SetterForXRateLimit { + public interface SetterForCode200ResponseXRateLimit { Map getInstance(); - T getBuilderAfterXRateLimit(Map instance); + T getBuilderAfterCode200ResponseXRateLimit(Map instance); default T setXHyphenMinusRateHyphenMinusLimit(int value) { var instance = getInstance(); instance.put("X-Rate-Limit", value); - return getBuilderAfterXRateLimit(instance); + return getBuilderAfterCode200ResponseXRateLimit(instance); } default T setXHyphenMinusRateHyphenMinusLimit(float value) { var instance = getInstance(); instance.put("X-Rate-Limit", value); - return getBuilderAfterXRateLimit(instance); + return getBuilderAfterCode200ResponseXRateLimit(instance); } } - public interface SetterForInt32 { + public interface SetterForCode200ResponseInt32 { Map getInstance(); - T getBuilderAfterInt32(Map instance); + T getBuilderAfterCode200ResponseInt32(Map instance); default T int32(int value) { var instance = getInstance(); instance.put("int32", value); - return getBuilderAfterInt32(instance); + return getBuilderAfterCode200ResponseInt32(instance); } default T int32(float value) { var instance = getInstance(); instance.put("int32", value); - return getBuilderAfterInt32(instance); + return getBuilderAfterCode200ResponseInt32(instance); } } - public interface SetterForRefcontentschemaheader { + public interface SetterForCode200ResponseRefcontentschemaheader { Map getInstance(); - T getBuilderAfterRefcontentschemaheader(Map instance); + T getBuilderAfterCode200ResponseRefcontentschemaheader(Map instance); default T setRefHyphenMinusContentHyphenMinusSchemaHyphenMinusHeader(String value) { var instance = getInstance(); instance.put("ref-content-schema-header", value); - return getBuilderAfterRefcontentschemaheader(instance); + return getBuilderAfterCode200ResponseRefcontentschemaheader(instance); } } - public interface SetterForXExpiresAfter { + public interface SetterForCode200ResponseXExpiresAfter { Map getInstance(); - T getBuilderAfterXExpiresAfter(Map instance); + T getBuilderAfterCode200ResponseXExpiresAfter(Map instance); default T setXHyphenMinusExpiresHyphenMinusAfter(String value) { var instance = getInstance(); instance.put("X-Expires-After", value); - return getBuilderAfterXExpiresAfter(instance); + return getBuilderAfterCode200ResponseXExpiresAfter(instance); } } - public interface SetterForNumberHeader { + public interface SetterForCode200ResponseNumberHeader { Map getInstance(); - T getBuilderAfterNumberHeader(Map instance); + T getBuilderAfterCode200ResponseNumberHeader(Map instance); default T numberHeader(String value) { var instance = getInstance(); instance.put("numberHeader", value); - return getBuilderAfterNumberHeader(instance); + return getBuilderAfterCode200ResponseNumberHeader(instance); } } - public static class HeadersSchemaMap000Builder implements GenericBuilder>, SetterForXExpiresAfter, SetterForNumberHeader { + public static class Code200ResponseHeadersSchemaMap000Builder implements GenericBuilder>, SetterForCode200ResponseXExpiresAfter, SetterForCode200ResponseNumberHeader { private final Map instance; private static final Set knownKeys = Set.of( "X-Rate-Limit", @@ -161,7 +161,7 @@ public static class HeadersSchemaMap000Builder implements GenericBuilder getKnownKeys() { return knownKeys; } - public HeadersSchemaMap000Builder(Map instance) { + public Code200ResponseHeadersSchemaMap000Builder(Map instance) { this.instance = instance; } public Map build() { @@ -170,126 +170,126 @@ public HeadersSchemaMap000Builder(Map instance) { public Map getInstance() { return instance; } - public HeadersSchemaMap000Builder getBuilderAfterXExpiresAfter(Map instance) { + public Code200ResponseHeadersSchemaMap000Builder getBuilderAfterCode200ResponseXExpiresAfter(Map instance) { return this; } - public HeadersSchemaMap000Builder getBuilderAfterNumberHeader(Map instance) { + public Code200ResponseHeadersSchemaMap000Builder getBuilderAfterCode200ResponseNumberHeader(Map instance) { return this; } } - public static class HeadersSchemaMap001Builder implements SetterForRefcontentschemaheader { + public static class Code200ResponseHeadersSchemaMap001Builder implements SetterForCode200ResponseRefcontentschemaheader { private final Map instance; - public HeadersSchemaMap001Builder(Map instance) { + public Code200ResponseHeadersSchemaMap001Builder(Map instance) { this.instance = instance; } public Map getInstance() { return instance; } - public HeadersSchemaMap000Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap000Builder(instance); + public Code200ResponseHeadersSchemaMap000Builder getBuilderAfterCode200ResponseRefcontentschemaheader(Map instance) { + return new Code200ResponseHeadersSchemaMap000Builder(instance); } } - public static class HeadersSchemaMap010Builder implements SetterForInt32 { + public static class Code200ResponseHeadersSchemaMap010Builder implements SetterForCode200ResponseInt32 { private final Map instance; - public HeadersSchemaMap010Builder(Map instance) { + public Code200ResponseHeadersSchemaMap010Builder(Map instance) { this.instance = instance; } public Map getInstance() { return instance; } - public HeadersSchemaMap000Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap000Builder(instance); + public Code200ResponseHeadersSchemaMap000Builder getBuilderAfterCode200ResponseInt32(Map instance) { + return new Code200ResponseHeadersSchemaMap000Builder(instance); } } - public static class HeadersSchemaMap011Builder implements SetterForInt32, SetterForRefcontentschemaheader { + public static class Code200ResponseHeadersSchemaMap011Builder implements SetterForCode200ResponseInt32, SetterForCode200ResponseRefcontentschemaheader { private final Map instance; - public HeadersSchemaMap011Builder(Map instance) { + public Code200ResponseHeadersSchemaMap011Builder(Map instance) { this.instance = instance; } public Map getInstance() { return instance; } - public HeadersSchemaMap001Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap001Builder(instance); + public Code200ResponseHeadersSchemaMap001Builder getBuilderAfterCode200ResponseInt32(Map instance) { + return new Code200ResponseHeadersSchemaMap001Builder(instance); } - public HeadersSchemaMap010Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap010Builder(instance); + public Code200ResponseHeadersSchemaMap010Builder getBuilderAfterCode200ResponseRefcontentschemaheader(Map instance) { + return new Code200ResponseHeadersSchemaMap010Builder(instance); } } - public static class HeadersSchemaMap100Builder implements SetterForXRateLimit { + public static class Code200ResponseHeadersSchemaMap100Builder implements SetterForCode200ResponseXRateLimit { private final Map instance; - public HeadersSchemaMap100Builder(Map instance) { + public Code200ResponseHeadersSchemaMap100Builder(Map instance) { this.instance = instance; } public Map getInstance() { return instance; } - public HeadersSchemaMap000Builder getBuilderAfterXRateLimit(Map instance) { - return new HeadersSchemaMap000Builder(instance); + public Code200ResponseHeadersSchemaMap000Builder getBuilderAfterCode200ResponseXRateLimit(Map instance) { + return new Code200ResponseHeadersSchemaMap000Builder(instance); } } - public static class HeadersSchemaMap101Builder implements SetterForXRateLimit, SetterForRefcontentschemaheader { + public static class Code200ResponseHeadersSchemaMap101Builder implements SetterForCode200ResponseXRateLimit, SetterForCode200ResponseRefcontentschemaheader { private final Map instance; - public HeadersSchemaMap101Builder(Map instance) { + public Code200ResponseHeadersSchemaMap101Builder(Map instance) { this.instance = instance; } public Map getInstance() { return instance; } - public HeadersSchemaMap001Builder getBuilderAfterXRateLimit(Map instance) { - return new HeadersSchemaMap001Builder(instance); + public Code200ResponseHeadersSchemaMap001Builder getBuilderAfterCode200ResponseXRateLimit(Map instance) { + return new Code200ResponseHeadersSchemaMap001Builder(instance); } - public HeadersSchemaMap100Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap100Builder(instance); + public Code200ResponseHeadersSchemaMap100Builder getBuilderAfterCode200ResponseRefcontentschemaheader(Map instance) { + return new Code200ResponseHeadersSchemaMap100Builder(instance); } } - public static class HeadersSchemaMap110Builder implements SetterForXRateLimit, SetterForInt32 { + public static class Code200ResponseHeadersSchemaMap110Builder implements SetterForCode200ResponseXRateLimit, SetterForCode200ResponseInt32 { private final Map instance; - public HeadersSchemaMap110Builder(Map instance) { + public Code200ResponseHeadersSchemaMap110Builder(Map instance) { this.instance = instance; } public Map getInstance() { return instance; } - public HeadersSchemaMap010Builder getBuilderAfterXRateLimit(Map instance) { - return new HeadersSchemaMap010Builder(instance); + public Code200ResponseHeadersSchemaMap010Builder getBuilderAfterCode200ResponseXRateLimit(Map instance) { + return new Code200ResponseHeadersSchemaMap010Builder(instance); } - public HeadersSchemaMap100Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap100Builder(instance); + public Code200ResponseHeadersSchemaMap100Builder getBuilderAfterCode200ResponseInt32(Map instance) { + return new Code200ResponseHeadersSchemaMap100Builder(instance); } } - public static class HeadersSchemaMapBuilder implements SetterForXRateLimit, SetterForInt32, SetterForRefcontentschemaheader { + public static class Code200ResponseHeadersSchemaMapBuilder implements SetterForCode200ResponseXRateLimit, SetterForCode200ResponseInt32, SetterForCode200ResponseRefcontentschemaheader { private final Map instance; - public HeadersSchemaMapBuilder() { + public Code200ResponseHeadersSchemaMapBuilder() { this.instance = new LinkedHashMap<>(); } public Map getInstance() { return instance; } - public HeadersSchemaMap011Builder getBuilderAfterXRateLimit(Map instance) { - return new HeadersSchemaMap011Builder(instance); + public Code200ResponseHeadersSchemaMap011Builder getBuilderAfterCode200ResponseXRateLimit(Map instance) { + return new Code200ResponseHeadersSchemaMap011Builder(instance); } - public HeadersSchemaMap101Builder getBuilderAfterInt32(Map instance) { - return new HeadersSchemaMap101Builder(instance); + public Code200ResponseHeadersSchemaMap101Builder getBuilderAfterCode200ResponseInt32(Map instance) { + return new Code200ResponseHeadersSchemaMap101Builder(instance); } - public HeadersSchemaMap110Builder getBuilderAfterRefcontentschemaheader(Map instance) { - return new HeadersSchemaMap110Builder(instance); + public Code200ResponseHeadersSchemaMap110Builder getBuilderAfterCode200ResponseRefcontentschemaheader(Map instance) { + return new Code200ResponseHeadersSchemaMap110Builder(instance); } } - public sealed interface HeadersSchema1Boxed permits HeadersSchema1BoxedMap { + public sealed interface Code200ResponseHeadersSchema1Boxed permits Code200ResponseHeadersSchema1BoxedMap { @Nullable Object getData(); } - public record HeadersSchema1BoxedMap(HeadersSchemaMap data) implements HeadersSchema1Boxed { + public record Code200ResponseHeadersSchema1BoxedMap(Code200ResponseHeadersSchemaMap data) implements Code200ResponseHeadersSchema1Boxed { @Override public @Nullable Object getData() { return data; @@ -297,10 +297,10 @@ public record HeadersSchema1BoxedMap(HeadersSchemaMap data) implements HeadersSc } - public static class HeadersSchema1 extends JsonSchema implements MapSchemaValidator { - private static @Nullable HeadersSchema1 instance = null; + public static class Code200ResponseHeadersSchema1 extends JsonSchema implements MapSchemaValidator { + private static @Nullable Code200ResponseHeadersSchema1 instance = null; - protected HeadersSchema1() { + protected Code200ResponseHeadersSchema1() { super(new JsonSchemaInfo() .type(Set.of(Map.class)) .properties(Map.ofEntries( @@ -315,18 +315,18 @@ protected HeadersSchema1() { "int32", "ref-content-schema-header" )) - .additionalProperties(AdditionalProperties.class) + .additionalProperties(Code200ResponseAdditionalProperties.class) ); } - public static HeadersSchema1 getInstance() { + public static Code200ResponseHeadersSchema1 getInstance() { if (instance == null) { - instance = new HeadersSchema1(); + instance = new Code200ResponseHeadersSchema1(); } return instance; } - public HeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { + public Code200ResponseHeadersSchemaMap getNewInstance(Map arg, List pathToItem, PathToSchemasMap pathToSchemas) { LinkedHashMap properties = new LinkedHashMap<>(); for(Map.Entry entry: arg.entrySet()) { @Nullable Object entryKey = entry.getKey(); @@ -346,10 +346,10 @@ public HeadersSchemaMap getNewInstance(Map arg, List pathToItem, P properties.put(propertyName, propertyInstance); } FrozenMap<@Nullable Object> castProperties = new FrozenMap<>(properties); - return new HeadersSchemaMap(castProperties); + return new Code200ResponseHeadersSchemaMap(castProperties); } - public HeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + public Code200ResponseHeadersSchemaMap validate(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { Set> pathSet = new HashSet<>(); List pathToItem = List.of("args[0"); Map castArg = castToAllowedTypes(arg, pathToItem, pathSet); @@ -375,11 +375,11 @@ public HeadersSchemaMap validate(Map arg, SchemaConfiguration configuratio throw new InvalidTypeException("Invalid input type="+getClass(arg)+". It can't be instantiated by this schema"); } @Override - public HeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { - return new HeadersSchema1BoxedMap(validate(arg, configuration)); + public Code200ResponseHeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + return new Code200ResponseHeadersSchema1BoxedMap(validate(arg, configuration)); } @Override - public HeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + public Code200ResponseHeadersSchema1Boxed validateAndBox(@Nullable Object arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { if (arg instanceof Map castArg) { return validateAndBox(castArg, configuration); } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers.java similarity index 87% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers.java index f270bbeadd1..7c88b23b59b 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers.java @@ -10,7 +10,7 @@ import java.util.Map; import java.util.AbstractMap; -public class Headers extends HeadersDeserializer { +public class Headers extends HeadersDeserializer { public Headers() { super( Map.ofEntries( @@ -20,7 +20,7 @@ public Headers() { new AbstractMap.SimpleEntry<>("ref-content-schema-header", new Refcontentschemaheader.Refcontentschemaheader1()), new AbstractMap.SimpleEntry<>("numberHeader", new NumberHeader.NumberHeader1()) ), - HeadersSchema.HeadersSchema1.getInstance() + Code200ResponseHeadersSchema.Code200ResponseHeadersSchema1.getInstance() ); } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java index 84193108bc1..bbd744abebc 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java @@ -24,6 +24,7 @@ public OutType deserialize(HttpHeaders responseHeaders, SchemaConfiguration conf String headerName = entry.getKey(); Header headerDeserializer = headers.get(headerName); if (headerDeserializer == null) { + // todo put this data in headersToValidate, if only one item in list load it in, otherwise join them with commas continue; } @Nullable Object headerValue = headerDeserializer.deserialize(entry.getValue(), false, configuration); diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index a1c4ed3f371..bb4b79cb80e 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -1147,21 +1147,32 @@ private String getSchemaPascalCaseName(String name, @NotNull String sourceJsonPa ) { if (pathPieces[2].equals("headers")) { // #/components/headers/someHeader/schema -> SomeHeaderSchema - usedKey = camelize(pathPieces[3])+ camelize(usedKey); + String headerFragment = pathPieces[3]; + usedKey = camelize(headerFragment)+ camelize(usedKey); } else if (sourceJsonPath.startsWith("#/components/responses/") && sourceJsonPath.contains("/headers/")) { - // #/components/response/SomeResponse/headers/someHeader/schema - usedKey = camelize(pathPieces[5])+ camelize(usedKey); + // #/components/responses/SomeResponse/headers/someHeader/schema + String headerFragment = pathPieces[5]; + usedKey = camelize(headerFragment)+ camelize(usedKey); } else { // #/paths/path/verb/responses/SomeResponse/headers/someHeader/schema - usedKey = camelize(pathPieces[7])+ camelize(usedKey); + String headerFragment = pathPieces[7]; + usedKey = camelize(headerFragment)+ camelize(usedKey); } } else if (pathPieces[pathPieces.length-3].equals("content")) { // #/requestBodies/SomeRequestBody/content/application-json/schema - String prefix = ModelUtils.decodeSlashes(pathPieces[pathPieces.length-2]); + String contentTypeFragment = pathPieces[pathPieces.length-2]; + String prefix = ModelUtils.decodeSlashes(contentTypeFragment); prefix = sanitizeName(prefix, "[^a-zA-Z0-9]+"); prefix = camelize(prefix); usedKey = prefix + camelize(usedKey); } + } else if (sourceJsonPath.endsWith(headersSchemaFragment) && pathPieces[pathPieces.length-3].equals("responses")) { + // #/components/responses/SomeResponse/HeadersSchema + // #/paths/path/verb/responses/200/HeadersSchema + String responseJsonPath = String.join("/", Arrays.copyOfRange(pathPieces, 0, pathPieces.length-1)); + String responseFragment = pathPieces[pathPieces.length-2]; + String pascalCaseResponse = getPascalCaseResponse(responseFragment, responseJsonPath); + usedKey = pascalCaseResponse + camelize(usedKey); } HashMap keyToQty = sourceJsonPathToKeyToQty.getOrDefault(sourceJsonPath, new HashMap<>()); From 5b6263579124bc27f06da7bd889226be1773c820 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 23:26:46 -0800 Subject: [PATCH 23/32] Fixes Headers class names --- .../client/petstore/java/.openapi-generator/FILES | 6 +++--- .../{headers.java => Headers.java} | 0 .../{headers.java => Headers.java} | 0 .../{headers.java => Headers.java} | 0 .../codegen/generators/DefaultGenerator.java | 13 +++++++++---- 5 files changed, 12 insertions(+), 7 deletions(-) rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/{headers.java => Headers.java} (100%) rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/{headers.java => Headers.java} (100%) rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/{headers.java => Headers.java} (100%) diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 1628bb4015c..028440c0bae 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -359,20 +359,20 @@ src/main/java/org/openapijsonschematools/client/components/responses/SuccessDesc src/main/java/org/openapijsonschematools/client/components/responses/SuccessInlineContentAndHeader.java src/main/java/org/openapijsonschematools/client/components/responses/SuccessWithJsonApiResponse.java src/main/java/org/openapijsonschematools/client/components/responses/SuccessfulXmlAndJsonArrayOfPet.java +src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersWithNoBodyHeadersSchema.java -src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/Location.java src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers/location/LocationSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successfulxmlandjsonarrayofpet/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successfulxmlandjsonarrayofpet/content/applicationxml/ApplicationxmlSchema.java +src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/SuccessInlineContentAndHeaderHeadersSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/content/applicationjson/ApplicationjsonSchema.java -src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/SomeHeader.java src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers/someheader/SomeHeaderSchema.java +src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/SuccessWithJsonApiResponseHeadersSchema.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/content/applicationjson/ApplicationjsonSchema.java -src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Int32.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/Refcontentschemaheader.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java similarity index 100% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/headers.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java similarity index 100% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/headers.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/Headers.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java similarity index 100% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/Headers.java diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java index 1a3a621207f..5a57d12a2d4 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java @@ -3791,6 +3791,10 @@ protected void updateComponentsFilepath(String[] pathPieces) { } else if (pathPieces[2].equals("responses")) { // #/components/responses/SuccessWithJsonApiResponse/headers pathPieces[3] = toResponseModuleName(pathPieces[3], jsonPath); + if (pathPieces.length == 4) { + // #/components/responses/SuccessWithJsonApiResponse + return; + } if (pathPieces.length == 5 && pathPieces[4].equals(headersSchemaFragment)) { // synthetic json path @@ -3799,11 +3803,12 @@ protected void updateComponentsFilepath(String[] pathPieces) { return; } - if (pathPieces.length < 6) { - return; - } if (pathPieces[4].equals("headers")) { - pathPieces[4] = toHeaderFilename(pathPieces[4], jsonPath); + if (pathPieces.length == 5) { + pathPieces[4] = toHeaderFilename(pathPieces[4], jsonPath); + // #/components/responses/someResponse/headers + return; + } // #/components/responses/someResponse/headers/SomeHeader-> length 6 pathPieces[5] = toHeaderFilename(pathPieces[5], jsonPath); if (pathPieces.length >= 8 && pathPieces[6].equals("content")) { From fdfbab4e5626a0af1596605ca878b1994df09b86 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Thu, 29 Feb 2024 23:51:55 -0800 Subject: [PATCH 24/32] Improves conditionals used in file path generation --- .../client/petstore/java/.openapi-generator/FILES | 2 +- .../codegen/generators/DefaultGenerator.java | 14 ++++++++++---- .../codegen/generators/JavaClientGenerator.java | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 028440c0bae..9491651a7ec 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -950,9 +950,9 @@ src/main/java/org/openapijsonschematools/client/paths/userlogin/get/parameters/p src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code400Response.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Code200ResponseHeadersSchema.java +src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/content/applicationjson/ApplicationjsonSchema.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/content/applicationxml/ApplicationxmlSchema.java -src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Int32.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/Refcontentschemaheader.java diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java index 5a57d12a2d4..2cce7bd08f1 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java @@ -3923,6 +3923,11 @@ private void updatePathsFilepath(String[] pathPieces) { } // #/paths/user_login/get/responses/200 -> 200 -> response_200 -> length 6 pathPieces[5] = toResponseModuleName(pathPieces[5], jsonPath); + if (pathPieces.length == 6) { + // #/paths/user_login/get/responses/200 + return; + } + if (pathPieces.length == 7 && pathPieces[6].equals(headersSchemaFragment)) { // synthetic json path // #/paths/user_login/get/responses/200/Headers @@ -3930,9 +3935,6 @@ private void updatePathsFilepath(String[] pathPieces) { return; } - if (pathPieces.length < 8) { - return; - } if (pathPieces[6].equals("content")) { // #/paths/somePath/get/responses/200/content/application-json -> length 8 String contentType = ModelUtils.decodeSlashes(pathPieces[7]); @@ -3941,7 +3943,11 @@ private void updatePathsFilepath(String[] pathPieces) { pathPieces[8] = getSchemaFilename(jsonPath); } } else if (pathPieces[6].equals("headers")) { - pathPieces[6] = toHeaderFilename(pathPieces[6], jsonPath); + if (pathPieces.length == 7) { + // #/paths/somePath/get/responses/200/headers + pathPieces[6] = toHeaderFilename(pathPieces[6], jsonPath); + return; + } // #/paths/somePath/get/responses/200/headers/someHeader -> length 8 pathPieces[7] = toHeaderFilename(pathPieces[7], jsonPath); diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index bb4b79cb80e..0a125973aec 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -1011,7 +1011,7 @@ public String toHeaderFilename(String componentName, String jsonPath) { if (pathPieces.length == 5) { // #/components/responses/SomeResponse/headers return "Headers"; - } else if (pathPieces.length == 6 && !componentName.equals("headers")) { + } else if (pathPieces.length == 6) { // #/components/responses/SomeResponse/headers/SomeHeader return toModelName(componentName, null); } @@ -1021,7 +1021,7 @@ public String toHeaderFilename(String componentName, String jsonPath) { if (pathPieces.length == 7) { // #/paths/somePath/verb/responses/200/headers return "Headers"; - } else if (pathPieces.length == 8 && !componentName.equals("headers")) { + } else if (pathPieces.length == 8) { // #/paths/somePath/verb/responses/200/headers/SomeHeader return toModelName(componentName, null); } From 3de1c4c330f6985581a376c5a4088ac90c752ff0 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 1 Mar 2024 00:26:13 -0800 Subject: [PATCH 25/32] Adds responses header schema import --- .../client/paths/userlogin/get/Responses.java | 1 + .../main/java/packagename/components/responses/Responses.hbs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/Responses.java index d6c6fa038fe..8f420073ee1 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/Responses.java @@ -1,6 +1,7 @@ package org.openapijsonschematools.client.paths.userlogin.get; import org.openapijsonschematools.client.paths.userlogin.get.responses.Code200Response; +import org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.Code200ResponseHeadersSchema; import org.openapijsonschematools.client.paths.userlogin.get.responses.Code400Response; import org.openapijsonschematools.client.exceptions.ApiException; import org.openapijsonschematools.client.response.ApiResponse; diff --git a/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs b/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs index 451981e9a22..5962c297a5f 100644 --- a/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs @@ -2,6 +2,9 @@ package {{packageName}}.{{responses.subpackage}}; {{#each responses}} import {{{packageName}}}.{{subpackage}}.{{jsonPathPiece.pascalCase}}; + {{#with headersObjectSchema}} +import {{{packageName}}}.{{subpackage}}.{{containerJsonPathPiece.pascalCase}}; + {{/with}} {{/each}} import {{{packageName}}}.exceptions.ApiException; {{#if nonErrorResponses }} From 5d735e1c3dac78c925c2cd7e76e39acacab40d0e Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 1 Mar 2024 00:36:42 -0800 Subject: [PATCH 26/32] Integrates headers in sealed responses --- .../anotherfakedummy/patch/Responses.java | 9 ++---- .../commonparamsubdir/delete/Responses.java | 9 ++---- .../commonparamsubdir/get/Responses.java | 9 ++---- .../commonparamsubdir/post/Responses.java | 9 ++---- .../client/paths/fake/delete/Responses.java | 9 ++---- .../client/paths/fake/get/Responses.java | 9 ++---- .../client/paths/fake/patch/Responses.java | 9 ++---- .../client/paths/fake/post/Responses.java | 9 ++---- .../get/Responses.java | 9 ++---- .../fakebodywithfileschema/put/Responses.java | 9 ++---- .../put/Responses.java | 9 ++---- .../put/Responses.java | 9 ++---- .../fakeclassnametest/patch/Responses.java | 9 ++---- .../fakedeletecoffeeid/delete/Responses.java | 18 ++++------- .../paths/fakehealth/get/Responses.java | 9 ++---- .../post/Responses.java | 9 ++---- .../fakeinlinecomposition/post/Responses.java | 9 ++---- .../paths/fakejsonformdata/get/Responses.java | 9 ++---- .../paths/fakejsonpatch/patch/Responses.java | 9 ++---- .../fakejsonwithcharset/post/Responses.java | 9 ++---- .../post/Responses.java | 9 ++---- .../get/Responses.java | 18 ++++------- .../fakemultiplesecurities/get/Responses.java | 9 ++---- .../paths/fakeobjinquery/get/Responses.java | 9 ++---- .../post/Responses.java | 9 ++---- .../fakepemcontenttype/get/Responses.java | 9 ++---- .../post/Responses.java | 9 ++---- .../get/Responses.java | 9 ++---- .../paths/fakeredirection/get/Responses.java | 16 ++++------ .../fakerefobjinquery/get/Responses.java | 9 ++---- .../fakerefsarraymodel/post/Responses.java | 9 ++---- .../fakerefsarrayofenums/post/Responses.java | 9 ++---- .../paths/fakerefsboolean/post/Responses.java | 9 ++---- .../post/Responses.java | 9 ++---- .../paths/fakerefsenum/post/Responses.java | 9 ++---- .../paths/fakerefsmammal/post/Responses.java | 9 ++---- .../paths/fakerefsnumber/post/Responses.java | 9 ++---- .../post/Responses.java | 9 ++---- .../paths/fakerefsstring/post/Responses.java | 9 ++---- .../get/Responses.java | 9 ++---- .../faketestqueryparamters/put/Responses.java | 9 ++---- .../post/Responses.java | 9 ++---- .../paths/fakeuploadfile/post/Responses.java | 9 ++---- .../paths/fakeuploadfiles/post/Responses.java | 9 ++---- .../fakewildcardresponses/get/Responses.java | 30 ++++++------------- .../client/paths/foo/get/Responses.java | 9 ++---- .../client/paths/pet/post/Responses.java | 9 ++---- .../paths/petfindbystatus/get/Responses.java | 9 ++---- .../paths/petfindbytags/get/Responses.java | 9 ++---- .../client/paths/petpetid/get/Responses.java | 9 ++---- .../petpetiduploadimage/post/Responses.java | 9 ++---- .../client/paths/solidus/get/Responses.java | 9 ++---- .../paths/storeinventory/get/Responses.java | 9 ++---- .../paths/storeorder/post/Responses.java | 9 ++---- .../storeorderorderid/get/Responses.java | 9 ++---- .../client/paths/user/post/Responses.java | 9 ++---- .../usercreatewitharray/post/Responses.java | 9 ++---- .../usercreatewithlist/post/Responses.java | 9 ++---- .../client/paths/userlogin/get/Responses.java | 11 +++---- .../paths/userlogout/get/Responses.java | 9 ++---- .../paths/userusername/delete/Responses.java | 9 ++---- .../paths/userusername/get/Responses.java | 9 ++---- .../components/responses/Responses.hbs | 13 ++++---- .../components/responses/_returnOrThrow.hbs | 2 +- 64 files changed, 207 insertions(+), 414 deletions(-) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/Responses.java index 05784c2cc61..e7c62840101 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/delete/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/delete/Responses.java index 199dec20968..ac61599b023 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/delete/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/delete/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/get/Responses.java index 7d1ba52c9da..2e9856cd26e 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/post/Responses.java index d7444126565..3ac09dfbbb6 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/commonparamsubdir/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/delete/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/delete/Responses.java index e844af8872d..5e220e5decd 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/delete/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/delete/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/get/Responses.java index 9062d42ce99..4216c774363 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/get/Responses.java @@ -17,12 +17,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode404ResponseDeserializer {} @@ -52,7 +49,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else { StatusCode404ResponseDeserializer castDeserializer = (StatusCode404ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/patch/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/patch/Responses.java index f7f322a3fc6..903ab9cd2b1 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/patch/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/patch/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/post/Responses.java index 679ab3391fc..0347ac523e0 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fake/post/Responses.java @@ -17,12 +17,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode404ResponseDeserializer {} @@ -52,7 +49,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else { StatusCode404ResponseDeserializer castDeserializer = (StatusCode404ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeadditionalpropertieswitharrayofenums/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeadditionalpropertieswitharrayofenums/get/Responses.java index 22a58272836..fd1ec82a26a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeadditionalpropertieswitharrayofenums/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeadditionalpropertieswitharrayofenums/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakebodywithfileschema/put/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakebodywithfileschema/put/Responses.java index 3e68f7af88b..cc35746e142 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakebodywithfileschema/put/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakebodywithfileschema/put/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakebodywithqueryparams/put/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakebodywithqueryparams/put/Responses.java index 3ee8330f8cd..cd75c88f985 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakebodywithqueryparams/put/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakebodywithqueryparams/put/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakecasesensitiveparams/put/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakecasesensitiveparams/put/Responses.java index 4d7319c76a9..a82cea7d6d7 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakecasesensitiveparams/put/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakecasesensitiveparams/put/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeclassnametest/patch/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeclassnametest/patch/Responses.java index 9bcd68eb014..20b70774ed5 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeclassnametest/patch/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeclassnametest/patch/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakedeletecoffeeid/delete/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakedeletecoffeeid/delete/Responses.java index 721290acb00..4707c2d13b3 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakedeletecoffeeid/delete/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakedeletecoffeeid/delete/Responses.java @@ -17,22 +17,16 @@ public sealed interface EndpointResponse permits EndpointCode200Response, Endpoi public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public record EndpointCodedefaultResponse( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -56,10 +50,10 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu if (statusCodeDeserializer != null) { StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } var deserializedResponse = defaultResponseDeserializer.deserialize(response, configuration); - return new EndpointCodedefaultResponse(response, deserializedResponse.body()); + return new EndpointCodedefaultResponse(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakehealth/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakehealth/get/Responses.java index 872340f1217..06d52e39237 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakehealth/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakehealth/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlineadditionalproperties/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlineadditionalproperties/post/Responses.java index dc15916fd52..37c62eb8e53 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlineadditionalproperties/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlineadditionalproperties/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlinecomposition/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlinecomposition/post/Responses.java index 71f8975f334..eca3f947dfa 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlinecomposition/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeinlinecomposition/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonformdata/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonformdata/get/Responses.java index b8314899009..c33a942e753 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonformdata/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonformdata/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonpatch/patch/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonpatch/patch/Responses.java index 2baa6cd0b4b..d2adc74ceed 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonpatch/patch/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonpatch/patch/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonwithcharset/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonwithcharset/post/Responses.java index dfc15423aa9..2c6b3699664 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonwithcharset/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakejsonwithcharset/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplerequestbodycontenttypes/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplerequestbodycontenttypes/post/Responses.java index ef63971c522..a9d9f512c9a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplerequestbodycontenttypes/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplerequestbodycontenttypes/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/Responses.java index b5d26f30a77..1a783d3ac7b 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultipleresponsebodies/get/Responses.java @@ -17,22 +17,16 @@ public sealed interface EndpointResponse permits EndpointCode200Response, Endpoi public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public record EndpointCode202Response( HttpResponse response, - Code202Response.SealedResponseBody body + Code202Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode202ResponseDeserializer {} @@ -62,11 +56,11 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else { StatusCode202ResponseDeserializer castDeserializer = (StatusCode202ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode202Response(response, deserializedResponse.body()); + return new EndpointCode202Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplesecurities/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplesecurities/get/Responses.java index d841b9c4771..ce504a325bf 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplesecurities/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakemultiplesecurities/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeobjinquery/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeobjinquery/get/Responses.java index 0b4cc77fe60..e17ef11e287 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeobjinquery/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeobjinquery/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeparametercollisions1ababselfab/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeparametercollisions1ababselfab/post/Responses.java index 3ed1961e32e..6f9f5877987 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeparametercollisions1ababselfab/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeparametercollisions1ababselfab/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepemcontenttype/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepemcontenttype/get/Responses.java index 6c159b82205..617d012d016 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepemcontenttype/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepemcontenttype/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepetiduploadimagewithrequiredfile/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepetiduploadimagewithrequiredfile/post/Responses.java index cac3aba755a..10353a08dc3 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepetiduploadimagewithrequiredfile/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakepetiduploadimagewithrequiredfile/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakequeryparamwithjsoncontenttype/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakequeryparamwithjsoncontenttype/get/Responses.java index 70c844a46e3..dc6b9ebe721 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakequeryparamwithjsoncontenttype/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakequeryparamwithjsoncontenttype/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/Responses.java index e34ab33adcc..1678ade8102 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeredirection/get/Responses.java @@ -17,22 +17,16 @@ public sealed interface EndpointResponse permits EndpointCode3XXResponse, Endpoi public record EndpointCode3XXResponse( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public record EndpointCode303Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode303ResponseDeserializer {} @@ -62,7 +56,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu if (statusCodeDeserializer != null) { StatusCode303ResponseDeserializer castDeserializer = (StatusCode303ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode303Response(response, deserializedResponse.body()); + return new EndpointCode303Response(response, deserializedResponse.body(), deserializedResponse.headers()); } @Nullable WildcardCodeResponseDeserializer wildcardCodeDeserializer = wildcardCodeToResponseDeserializer.get(statusCode); if (wildcardCodeDeserializer == null) { diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefobjinquery/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefobjinquery/get/Responses.java index f3c7736a3f0..1a8dca8dcdd 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefobjinquery/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefobjinquery/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarraymodel/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarraymodel/post/Responses.java index 8d017e722c4..da739f84545 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarraymodel/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarraymodel/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarrayofenums/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarrayofenums/post/Responses.java index 5dfb0d00f27..3c02dbbae03 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarrayofenums/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsarrayofenums/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsboolean/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsboolean/post/Responses.java index 96b31771303..ef2da8a829a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsboolean/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsboolean/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefscomposedoneofnumberwithvalidations/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefscomposedoneofnumberwithvalidations/post/Responses.java index 72341574f96..bffd6a98a2a 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefscomposedoneofnumberwithvalidations/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefscomposedoneofnumberwithvalidations/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsenum/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsenum/post/Responses.java index 49903cc1f2e..c2b067d4643 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsenum/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsenum/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsmammal/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsmammal/post/Responses.java index 35e9f7269bb..de909f096bc 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsmammal/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsmammal/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsnumber/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsnumber/post/Responses.java index 4545f0d8533..622310c701c 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsnumber/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsnumber/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsobjectmodelwithrefprops/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsobjectmodelwithrefprops/post/Responses.java index 49609d743ed..838601e6f24 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsobjectmodelwithrefprops/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsobjectmodelwithrefprops/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsstring/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsstring/post/Responses.java index 09b8212b20d..331a3bc8816 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsstring/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakerefsstring/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeresponsewithoutschema/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeresponsewithoutschema/get/Responses.java index 087c995bb44..0c0edb117cd 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeresponsewithoutschema/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeresponsewithoutschema/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/faketestqueryparamters/put/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/faketestqueryparamters/put/Responses.java index f1e32ebf987..68868dd0442 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/faketestqueryparamters/put/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/faketestqueryparamters/put/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploaddownloadfile/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploaddownloadfile/post/Responses.java index cb872801735..f7be0054859 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploaddownloadfile/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploaddownloadfile/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfile/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfile/post/Responses.java index 6e2100465e9..033ad2c8f72 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfile/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfile/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfiles/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfiles/post/Responses.java index 0b61b6ee1a0..1fa96a8e7e1 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfiles/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakeuploadfiles/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/Responses.java index cef5287b1a6..2070a4ae1db 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/fakewildcardresponses/get/Responses.java @@ -21,42 +21,30 @@ public sealed interface EndpointResponse permits EndpointCode1XXResponse, Endpoi public record EndpointCode1XXResponse( HttpResponse response, - Code1XXResponse.SealedResponseBody body + Code1XXResponse.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public record EndpointCode2XXResponse( HttpResponse response, - Code2XXResponse.SealedResponseBody body + Code2XXResponse.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public record EndpointCode3XXResponse( HttpResponse response, - Code3XXResponse.SealedResponseBody body + Code3XXResponse.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -98,7 +86,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu if (statusCodeDeserializer != null) { StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } @Nullable WildcardCodeResponseDeserializer wildcardCodeDeserializer = wildcardCodeToResponseDeserializer.get(statusCode); if (wildcardCodeDeserializer == null) { diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/Responses.java index dc5f2cf7e5d..21bffb7e427 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/foo/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCodedefaultResponse {} public record EndpointCodedefaultResponse( HttpResponse response, - CodedefaultResponse.SealedResponseBody body + CodedefaultResponse.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public static final class Responses1 implements ResponsesDeserializer { @@ -32,7 +29,7 @@ public Responses1() { public EndpointResponse deserialize(HttpResponse response, SchemaConfiguration configuration) { var deserializedResponse = defaultResponseDeserializer.deserialize(response, configuration); - return new EndpointCodedefaultResponse(response, deserializedResponse.body()); + return new EndpointCodedefaultResponse(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/post/Responses.java index a39e6ae72ba..db2e91906cc 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/pet/post/Responses.java @@ -17,12 +17,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode405ResponseDeserializer {} @@ -52,7 +49,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else { StatusCode405ResponseDeserializer castDeserializer = (StatusCode405ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/get/Responses.java index 073278eb8bf..bb6a09ea78c 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbystatus/get/Responses.java @@ -17,12 +17,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode400ResponseDeserializer {} @@ -52,7 +49,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else { StatusCode400ResponseDeserializer castDeserializer = (StatusCode400ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbytags/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbytags/get/Responses.java index fc452ecd7be..82003a8b683 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbytags/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petfindbytags/get/Responses.java @@ -17,12 +17,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode400ResponseDeserializer {} @@ -52,7 +49,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else { StatusCode400ResponseDeserializer castDeserializer = (StatusCode400ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/Responses.java index 2780f842fd3..9717fcb81d3 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetid/get/Responses.java @@ -18,12 +18,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode400ResponseDeserializer, StatusCode404ResponseDeserializer {} @@ -56,7 +53,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else if (statusCodeDeserializer instanceof StatusCode400ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); throw new Code400Response.ResponseApiException( diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetiduploadimage/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetiduploadimage/post/Responses.java index 3f4b3062f18..1b8921ffe1f 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetiduploadimage/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetiduploadimage/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/solidus/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/solidus/get/Responses.java index 2f753fc4485..8f8f1f3fc78 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/solidus/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/solidus/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeinventory/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeinventory/get/Responses.java index 7ba860fcb45..2e2e40e9657 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeinventory/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeinventory/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +45,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } StatusCode200ResponseDeserializer castDeserializer = (StatusCode200ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/Responses.java index 4504dc5cbda..22f2bd6a7f1 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorder/post/Responses.java @@ -17,12 +17,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode400ResponseDeserializer {} @@ -52,7 +49,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else { StatusCode400ResponseDeserializer castDeserializer = (StatusCode400ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/Responses.java index 7007878e286..9aa9e0eb735 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeorderorderid/get/Responses.java @@ -18,12 +18,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode400ResponseDeserializer, StatusCode404ResponseDeserializer {} @@ -56,7 +53,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else if (statusCodeDeserializer instanceof StatusCode400ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); throw new Code400Response.ResponseApiException( diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/user/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/user/post/Responses.java index 6281a613f2d..cd6bedeaa49 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/user/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/user/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCodedefaultResponse {} public record EndpointCodedefaultResponse( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public static final class Responses1 implements ResponsesDeserializer { @@ -32,7 +29,7 @@ public Responses1() { public EndpointResponse deserialize(HttpResponse response, SchemaConfiguration configuration) { var deserializedResponse = defaultResponseDeserializer.deserialize(response, configuration); - return new EndpointCodedefaultResponse(response, deserializedResponse.body()); + return new EndpointCodedefaultResponse(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewitharray/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewitharray/post/Responses.java index 4915ddf78eb..90079ade7ee 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewitharray/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewitharray/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCodedefaultResponse {} public record EndpointCodedefaultResponse( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public static final class Responses1 implements ResponsesDeserializer { @@ -32,7 +29,7 @@ public Responses1() { public EndpointResponse deserialize(HttpResponse response, SchemaConfiguration configuration) { var deserializedResponse = defaultResponseDeserializer.deserialize(response, configuration); - return new EndpointCodedefaultResponse(response, deserializedResponse.body()); + return new EndpointCodedefaultResponse(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewithlist/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewithlist/post/Responses.java index b4ec50143c4..4d37cf3af39 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewithlist/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/usercreatewithlist/post/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCodedefaultResponse {} public record EndpointCodedefaultResponse( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public static final class Responses1 implements ResponsesDeserializer { @@ -32,7 +29,7 @@ public Responses1() { public EndpointResponse deserialize(HttpResponse response, SchemaConfiguration configuration) { var deserializedResponse = defaultResponseDeserializer.deserialize(response, configuration); - return new EndpointCodedefaultResponse(response, deserializedResponse.body()); + return new EndpointCodedefaultResponse(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/Responses.java index 8f420073ee1..f31d4fdabf4 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/Responses.java @@ -18,12 +18,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body - ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } + Code200Response.SealedResponseBody body, + Code200ResponseHeadersSchema.Code200ResponseHeadersSchemaMap headers + ) implements EndpointResponse, ApiResponse{ } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode400ResponseDeserializer {} @@ -53,7 +50,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else { StatusCode400ResponseDeserializer castDeserializer = (StatusCode400ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogout/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogout/get/Responses.java index 6ae2af2cb77..9bf34248b51 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogout/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogout/get/Responses.java @@ -16,12 +16,9 @@ public sealed interface EndpointResponse permits EndpointCodedefaultResponse {} public record EndpointCodedefaultResponse( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public static final class Responses1 implements ResponsesDeserializer { @@ -32,7 +29,7 @@ public Responses1() { public EndpointResponse deserialize(HttpResponse response, SchemaConfiguration configuration) { var deserializedResponse = defaultResponseDeserializer.deserialize(response, configuration); - return new EndpointCodedefaultResponse(response, deserializedResponse.body()); + return new EndpointCodedefaultResponse(response, deserializedResponse.body(), deserializedResponse.headers()); } } } diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/delete/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/delete/Responses.java index 8ca121ca5b6..5effba4ddc7 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/delete/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/delete/Responses.java @@ -17,12 +17,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Void body + Void body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode404ResponseDeserializer {} @@ -52,7 +49,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else { StatusCode404ResponseDeserializer castDeserializer = (StatusCode404ResponseDeserializer) statusCodeDeserializer; var deserializedResponse = castDeserializer.deserialize(response, configuration); diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/Responses.java index 46e3771793a..7be14427d06 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userusername/get/Responses.java @@ -18,12 +18,9 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, - Code200Response.SealedResponseBody body + Code200Response.SealedResponseBody body, + Void headers ) implements EndpointResponse, ApiResponse{ - @Override - public Void headers() { - return null; - } } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer, StatusCode400ResponseDeserializer, StatusCode404ResponseDeserializer {} @@ -56,7 +53,7 @@ public EndpointResponse deserialize(HttpResponse response, SchemaConfigu } if (statusCodeDeserializer instanceof StatusCode200ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); - return new EndpointCode200Response(response, deserializedResponse.body()); + return new EndpointCode200Response(response, deserializedResponse.body(), deserializedResponse.headers()); } else if (statusCodeDeserializer instanceof StatusCode400ResponseDeserializer castDeserializer) { var deserializedResponse = castDeserializer.deserialize(response, configuration); throw new Code400Response.ResponseApiException( diff --git a/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs b/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs index 5962c297a5f..e48cdb1a250 100644 --- a/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs @@ -25,12 +25,9 @@ public class {{responses.jsonPathPiece.pascalCase}} { public record Endpoint{{jsonPathPiece.pascalCase}}( HttpResponse response, - {{#if hasContentSchema}}{{jsonPathPiece.pascalCase}}.SealedResponseBody body{{else}}Void body{{/if}} - ) implements EndpointResponse, ApiResponse<{{#if hasContentSchema}}{{jsonPathPiece.pascalCase}}.SealedResponseBody{{else}}Void{{/if}}, Void>{ - @Override - public Void headers() { - return null; - } + {{#if hasContentSchema}}{{jsonPathPiece.pascalCase}}.SealedResponseBody{{else}}Void{{/if}} body, + {{#with headersObjectSchema}}{{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}}{{else}}Void{{/with}} headers + ) implements EndpointResponse, ApiResponse<{{#if hasContentSchema}}{{jsonPathPiece.pascalCase}}.SealedResponseBody{{else}}Void{{/if}}, {{#with headersObjectSchema}}{{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}}{{else}}Void{{/with}}>{ } {{/each}} {{/if}} @@ -140,12 +137,12 @@ public class {{responses.jsonPathPiece.pascalCase}} { {{/if}} var deserializedResponse = defaultResponseDeserializer.deserialize(response, configuration); {{#with defaultResponse}} - return new Endpoint{{jsonPathPiece.pascalCase}}(response, deserializedResponse.body()); + return new Endpoint{{jsonPathPiece.pascalCase}}(response, deserializedResponse.body(), deserializedResponse.headers()); {{/with}} {{else}} var deserializedResponse = defaultResponseDeserializer.deserialize(response, configuration); {{#with defaultResponse}} - return new Endpoint{{jsonPathPiece.pascalCase}}(response, deserializedResponse.body()); + return new Endpoint{{jsonPathPiece.pascalCase}}(response, deserializedResponse.body(), deserializedResponse.headers()); {{/with}} {{/or}} {{/and}} diff --git a/src/main/resources/java/src/main/java/packagename/components/responses/_returnOrThrow.hbs b/src/main/resources/java/src/main/java/packagename/components/responses/_returnOrThrow.hbs index 7413525e34c..a78943857fe 100644 --- a/src/main/resources/java/src/main/java/packagename/components/responses/_returnOrThrow.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/responses/_returnOrThrow.hbs @@ -1,6 +1,6 @@ {{#if nonErrorStatusCodes}} {{#contains nonErrorStatusCodes @key }} -return new Endpoint{{jsonPathPiece.pascalCase}}(response, deserializedResponse.body()); +return new Endpoint{{jsonPathPiece.pascalCase}}(response, deserializedResponse.body(), deserializedResponse.headers()); {{else}} throw new {{jsonPathPiece.pascalCase}}.ResponseApiException( "Received error statusCode response from server", From d39ee9f1fa5063f3f517339d7ad2ad75a8298c17 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 1 Mar 2024 11:24:25 -0800 Subject: [PATCH 27/32] Fixes header integration in responses when response is refed --- .../client/paths/petpetiduploadimage/post/Responses.java | 5 +++-- .../client/paths/storeinventory/get/Responses.java | 5 +++-- .../code200response/{headers.java => Headers.java} | 0 .../client/response/ResponseDeserializer.java | 2 +- .../client/response/ResponseDeserializerTest.java | 2 +- .../java/packagename/components/responses/Responses.hbs | 8 +++++--- .../java/packagename/response/ResponseDeserializer.hbs | 2 +- .../packagename/response/ResponseDeserializerTest.hbs | 2 +- 8 files changed, 15 insertions(+), 11 deletions(-) rename samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/{headers.java => Headers.java} (100%) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetiduploadimage/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetiduploadimage/post/Responses.java index 1b8921ffe1f..2510fe73af5 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetiduploadimage/post/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetiduploadimage/post/Responses.java @@ -1,6 +1,7 @@ package org.openapijsonschematools.client.paths.petpetiduploadimage.post; import org.openapijsonschematools.client.paths.petpetiduploadimage.post.responses.Code200Response; +import org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.SuccessWithJsonApiResponseHeadersSchema; import org.openapijsonschematools.client.exceptions.ApiException; import org.openapijsonschematools.client.response.ApiResponse; import org.openapijsonschematools.client.response.ResponsesDeserializer; @@ -17,8 +18,8 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, Code200Response.SealedResponseBody body, - Void headers - ) implements EndpointResponse, ApiResponse{ + SuccessWithJsonApiResponseHeadersSchema.SuccessWithJsonApiResponseHeadersSchemaMap headers + ) implements EndpointResponse, ApiResponse{ } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeinventory/get/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeinventory/get/Responses.java index 2e2e40e9657..ce5360d0cdb 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeinventory/get/Responses.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/storeinventory/get/Responses.java @@ -1,6 +1,7 @@ package org.openapijsonschematools.client.paths.storeinventory.get; import org.openapijsonschematools.client.paths.storeinventory.get.responses.Code200Response; +import org.openapijsonschematools.client.components.responses.successinlinecontentandheader.SuccessInlineContentAndHeaderHeadersSchema; import org.openapijsonschematools.client.exceptions.ApiException; import org.openapijsonschematools.client.response.ApiResponse; import org.openapijsonschematools.client.response.ResponsesDeserializer; @@ -17,8 +18,8 @@ public sealed interface EndpointResponse permits EndpointCode200Response {} public record EndpointCode200Response( HttpResponse response, Code200Response.SealedResponseBody body, - Void headers - ) implements EndpointResponse, ApiResponse{ + SuccessInlineContentAndHeaderHeadersSchema.SuccessInlineContentAndHeaderHeadersSchemaMap headers + ) implements EndpointResponse, ApiResponse{ } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java similarity index 100% rename from samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers.java rename to samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Headers.java diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java index a79dd391b16..59079f9f1a1 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java @@ -67,7 +67,7 @@ public DeserializedHttpResponse deserialize(HttpRe } byte[] bodyBytes = response.body(); SealedBodyClass body = getBody(contentType, bodyBytes, configuration); - HeaderClass headers = getHeaders(response.headers()); + HeaderClass headers = getHeaders(response.headers(), configuration); return new DeserializedHttpResponse<>(body, headers); } } \ No newline at end of file diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java index 76dc7f0165f..408f04582a8 100644 --- a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java @@ -80,7 +80,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs b/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs index e48cdb1a250..84089cf9d0f 100644 --- a/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs @@ -2,8 +2,10 @@ package {{packageName}}.{{responses.subpackage}}; {{#each responses}} import {{{packageName}}}.{{subpackage}}.{{jsonPathPiece.pascalCase}}; - {{#with headersObjectSchema}} + {{#with getSelfOrDeepestRef}} + {{#with headersObjectSchema}} import {{{packageName}}}.{{subpackage}}.{{containerJsonPathPiece.pascalCase}}; + {{/with}} {{/with}} {{/each}} import {{{packageName}}}.exceptions.ApiException; @@ -26,8 +28,8 @@ public class {{responses.jsonPathPiece.pascalCase}} { public record Endpoint{{jsonPathPiece.pascalCase}}( HttpResponse response, {{#if hasContentSchema}}{{jsonPathPiece.pascalCase}}.SealedResponseBody{{else}}Void{{/if}} body, - {{#with headersObjectSchema}}{{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}}{{else}}Void{{/with}} headers - ) implements EndpointResponse, ApiResponse<{{#if hasContentSchema}}{{jsonPathPiece.pascalCase}}.SealedResponseBody{{else}}Void{{/if}}, {{#with headersObjectSchema}}{{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}}{{else}}Void{{/with}}>{ + {{#with getSelfOrDeepestRef}}{{#with headersObjectSchema}}{{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}}{{else}}Void{{/with}}{{/with}} headers + ) implements EndpointResponse, ApiResponse<{{#if hasContentSchema}}{{jsonPathPiece.pascalCase}}.SealedResponseBody{{else}}Void{{/if}}, {{#with getSelfOrDeepestRef}}{{#with headersObjectSchema}}{{containerJsonPathPiece.pascalCase}}.{{mapOutputJsonPathPiece.pascalCase}}{{else}}Void{{/with}}{{/with}}>{ } {{/each}} {{/if}} diff --git a/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs index f8be6339ad9..0d19a394328 100644 --- a/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs +++ b/src/main/resources/java/src/main/java/packagename/response/ResponseDeserializer.hbs @@ -67,7 +67,7 @@ public abstract class ResponseDeserializer(body, headers); } } \ No newline at end of file diff --git a/src/main/resources/java/src/test/java/packagename/response/ResponseDeserializerTest.hbs b/src/main/resources/java/src/test/java/packagename/response/ResponseDeserializerTest.hbs index 53be13892f3..e06fe92a476 100644 --- a/src/main/resources/java/src/test/java/packagename/response/ResponseDeserializerTest.hbs +++ b/src/main/resources/java/src/test/java/packagename/response/ResponseDeserializerTest.hbs @@ -80,7 +80,7 @@ public class ResponseDeserializerTest { } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } From c61a1034679329c4d393da8f8eb9afb4531c07f3 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 1 Mar 2024 12:18:58 -0800 Subject: [PATCH 28/32] Samples and docs regen --- docs/generators/java.md | 12 +- .../java/.openapi-generator/FILES | 14 ++ .../contenttype/ContentTypeDeserializer.java | 18 ++ .../contenttype/ContentTypeDetector.java | 18 ++ .../contenttype/ContentTypeSerializer.java | 18 ++ .../client/header/ContentHeader.java | 62 ++++++ .../client/header/Header.java | 12 ++ .../client/header/HeaderBase.java | 18 ++ .../header/PrefixSeparatorIterator.java | 27 +++ .../client/header/Rfc6570Serializer.java | 186 ++++++++++++++++++ .../client/header/SchemaHeader.java | 95 +++++++++ .../client/header/StyleSimpleSerializer.java | 21 ++ .../client/mediatype/Encoding.java | 5 +- .../client/parameter/ParameterInType.java | 8 + .../requestbody/RequestBodySerializer.java | 29 +-- .../client/response/HeadersDeserializer.java | 35 ++++ .../client/response/ResponseDeserializer.java | 28 +-- .../client/header/ContentHeaderTest.java | 117 +++++++++++ .../client/header/SchemaHeaderTest.java | 161 +++++++++++++++ .../RequestBodySerializerTest.java | 13 +- .../response/ResponseDeserializerTest.java | 2 +- .../java/.openapi-generator/FILES | 14 ++ .../contenttype/ContentTypeDeserializer.java | 18 ++ .../contenttype/ContentTypeDetector.java | 18 ++ .../contenttype/ContentTypeSerializer.java | 18 ++ .../client/header/ContentHeader.java | 62 ++++++ .../client/header/Header.java | 12 ++ .../client/header/HeaderBase.java | 18 ++ .../header/PrefixSeparatorIterator.java | 27 +++ .../client/header/Rfc6570Serializer.java | 186 ++++++++++++++++++ .../client/header/SchemaHeader.java | 95 +++++++++ .../client/header/StyleSimpleSerializer.java | 21 ++ .../client/mediatype/Encoding.java | 5 +- .../client/parameter/ParameterInType.java | 8 + .../requestbody/RequestBodySerializer.java | 29 +-- .../client/response/HeadersDeserializer.java | 35 ++++ .../client/response/ResponseDeserializer.java | 28 +-- .../client/header/ContentHeaderTest.java | 117 +++++++++++ .../client/header/SchemaHeaderTest.java | 161 +++++++++++++++ .../RequestBodySerializerTest.java | 13 +- .../response/ResponseDeserializerTest.java | 2 +- .../petstore/python/.openapi-generator/FILES | 8 +- .../header_headers/__init__.py | 0 .../header_headers/__init__.py | 0 .../header_headers/__init__.py | 0 .../response_200/header_headers/__init__.py | 0 .../codegen/generators/DefaultGenerator.java | 8 + .../generators/JavaClientGenerator.java | 12 +- 48 files changed, 1697 insertions(+), 117 deletions(-) create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Header.java create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java create mode 100644 samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java create mode 100644 samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java create mode 100644 samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Header.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java create mode 100644 samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java create mode 100644 samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java create mode 100644 samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java create mode 100644 samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_headers/__init__.py create mode 100644 samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_headers/__init__.py create mode 100644 samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_headers/__init__.py create mode 100644 samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_headers/__init__.py diff --git a/docs/generators/java.md b/docs/generators/java.md index 9b4c5ca80f0..4c1dd046202 100644 --- a/docs/generators/java.md +++ b/docs/generators/java.md @@ -182,7 +182,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |parameters|✗|OAS3 |examples|✗|OAS3 |requestBodies|✓|OAS3 -|headers|✗|OAS3 +|headers|✓|OAS3 |securitySchemes|✓|OAS3 |links|✗|OAS3 |callbacks|✗|OAS3 @@ -223,7 +223,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |ComponentResponses|✓|OAS3 |ComponentParameters|✗|OAS3 |ComponentRequestBodies|✓|OAS3 -|ComponentHeaders|✗|OAS3 +|ComponentHeaders|✓|OAS3 |ComponentSecuritySchemes|✓|OAS3 |ComponentLinks|✗|OAS3 |ComponentCallbacks|✗|OAS3 @@ -245,10 +245,10 @@ These options may be applied as additional-properties (cli) or configOptions (pl ### Operation Feature | Name | Supported | Defined By | | ---- | --------- | ---------- | -|Responses_HttpStatusCode|✗|OAS3 -|Responses_RangedResponseCodes|✗|OAS3 -|Responses_Default|✗|OAS3 -|Responses_RedirectionResponse|✗|OAS3 +|Responses_HttpStatusCode|✓|OAS3 +|Responses_RangedResponseCodes|✓|OAS3 +|Responses_Default|✓|OAS3 +|Responses_RedirectionResponse|✓|OAS3 |Security|✓|OAS2,OAS3 |Servers|✓|OAS3 diff --git a/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES b/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES index ee787913b5c..70c0b464490 100644 --- a/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES +++ b/samples/client/3_0_3_unit_test/java/.openapi-generator/FILES @@ -179,20 +179,32 @@ src/main/java/org/openapijsonschematools/client/components/schemas/UriTemplateFo src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java src/main/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/client/configurations/SchemaConfiguration.java +src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java +src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java +src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java src/main/java/org/openapijsonschematools/client/exceptions/ApiException.java src/main/java/org/openapijsonschematools/client/exceptions/BaseException.java src/main/java/org/openapijsonschematools/client/exceptions/InvalidAdditionalPropertyException.java src/main/java/org/openapijsonschematools/client/exceptions/InvalidTypeException.java src/main/java/org/openapijsonschematools/client/exceptions/UnsetPropertyException.java src/main/java/org/openapijsonschematools/client/exceptions/ValidationException.java +src/main/java/org/openapijsonschematools/client/header/ContentHeader.java +src/main/java/org/openapijsonschematools/client/header/Header.java +src/main/java/org/openapijsonschematools/client/header/HeaderBase.java +src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java +src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java +src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java +src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java src/main/java/org/openapijsonschematools/client/mediatype/MediaType.java +src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java src/main/java/org/openapijsonschematools/client/parameter/ParameterStyle.java src/main/java/org/openapijsonschematools/client/requestbody/GenericRequestBody.java src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java src/main/java/org/openapijsonschematools/client/requestbody/SerializedRequestBody.java src/main/java/org/openapijsonschematools/client/response/ApiResponse.java src/main/java/org/openapijsonschematools/client/response/DeserializedHttpResponse.java +src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java src/main/java/org/openapijsonschematools/client/response/ResponsesDeserializer.java src/main/java/org/openapijsonschematools/client/schemas/AnyTypeJsonSchema.java @@ -296,6 +308,8 @@ src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java src/test/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlagsTest.java +src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java +src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java src/test/java/org/openapijsonschematools/client/schemas/AnyTypeSchemaTest.java diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java new file mode 100644 index 00000000000..f9ef315ea84 --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.contenttype; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class ContentTypeDeserializer { + private static final Gson gson = new GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .create(); + + @SuppressWarnings("nullness") + public static @Nullable Object fromJson(String json) { + return gson.fromJson(json, Object.class); + } +} diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java new file mode 100644 index 00000000000..6625c193f6a --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.contenttype; + +import java.util.regex.Pattern; + +public class ContentTypeDetector { + private static final Pattern jsonContentTypePattern = Pattern.compile( + "application/[^+]*[+]?(json);?.*" + ); + private static final String textPlainContentType = "text/plain"; + + public static boolean contentTypeIsJson(String contentType) { + return jsonContentTypePattern.matcher(contentType).find(); + } + + public static boolean contentTypeIsTextPlain(String contentType) { + return textPlainContentType.equals(contentType); + } +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java new file mode 100644 index 00000000000..51bcdeeddaf --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.contenttype; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class ContentTypeSerializer { + private static final Gson gson = new GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .create(); + + @SuppressWarnings("nullness") + public static String toJson(@Nullable Object body) { + return gson.toJson(body); + } +} diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java new file mode 100644 index 00000000000..2b09f2f77df --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java @@ -0,0 +1,62 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; +import org.openapijsonschematools.client.contenttype.ContentTypeSerializer; +import org.openapijsonschematools.client.contenttype.ContentTypeDeserializer; +import org.openapijsonschematools.client.mediatype.MediaType; +import org.openapijsonschematools.client.parameter.ParameterStyle; + +import java.net.http.HttpHeaders; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class ContentHeader extends HeaderBase implements Header { + public final Map> content; + + public ContentHeader(boolean required, @Nullable Boolean allowReserved, @Nullable Boolean explode, Map> content) { + super(required, ParameterStyle.SIMPLE, explode, allowReserved); + this.content = content; + } + + private static HttpHeaders toHeaders(String name, String value) { + Map> map = Map.of(name, List.of(value)); + BiPredicate headerFilter = (key, val) -> true; + return HttpHeaders.of(map, headerFilter); + } + + @Override + public HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) { + for (Map.Entry> entry: content.entrySet()) { + var castInData = validate ? entry.getValue().schema().validate(inData, configuration) : inData ; + String contentType = entry.getKey(); + if (ContentTypeDetector.contentTypeIsJson(contentType)) { + var value = ContentTypeSerializer.toJson(castInData); + return toHeaders(name, value); + } else { + throw new RuntimeException("Serialization of "+contentType+" has not yet been implemented"); + } + } + throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair"); + } + + @Override + public @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration) { + String inDataJoined = String.join(",", inData); // unsure if this is needed + @Nullable Object deserializedJson = ContentTypeDeserializer.fromJson(inDataJoined); + if (validate) { + for (Map.Entry> entry: content.entrySet()) { + String contentType = entry.getKey(); + if (ContentTypeDetector.contentTypeIsJson(contentType)) { + return entry.getValue().schema().validate(deserializedJson, configuration); + } else { + throw new RuntimeException("Header deserialization of "+contentType+" has not yet been implemented"); + } + } + throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair"); + } + return deserializedJson; + } +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Header.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Header.java new file mode 100644 index 00000000000..ac9f6274b0d --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Header.java @@ -0,0 +1,12 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; + +import java.net.http.HttpHeaders; +import java.util.List; + +public interface Header { + HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration); + @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration); +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java new file mode 100644 index 00000000000..23f22ebcf39 --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.parameter.ParameterStyle; + +public class HeaderBase { + public final boolean required; + public final @Nullable ParameterStyle style; + public final @Nullable Boolean explode; + public final @Nullable Boolean allowReserved; + + public HeaderBase(boolean required, @Nullable ParameterStyle style, @Nullable Boolean explode, @Nullable Boolean allowReserved) { + this.required = required; + this.style = style; + this.explode = explode; + this.allowReserved = allowReserved; + } +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java new file mode 100644 index 00000000000..522e71dfce4 --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java @@ -0,0 +1,27 @@ +package org.openapijsonschematools.client.header; + +import java.util.Set; + +public class PrefixSeparatorIterator { + // A class to store prefixes and separators for rfc6570 expansions + public final String prefix; + public final String separator; + private boolean first; + public final String itemSeparator; + private static final Set reusedSeparators = Set.of(".", "|", "%20"); + + public PrefixSeparatorIterator(String prefix, String separator) { + this.prefix = prefix; + this.separator = separator; + itemSeparator = reusedSeparators.contains(separator) ? separator : ","; + first = true; + } + + public String next() { + if (first) { + first = false; + return prefix; + } + return separator; + } +} diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java new file mode 100644 index 00000000000..7bac0c8a6be --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java @@ -0,0 +1,186 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.AbstractMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; + +public class Rfc6570Serializer { + private static final String ENCODING = "UTF-8"; + private static final Set namedParameterSeparators = Set.of("&", ";"); + + private static String percentEncode(String s) { + if (s == null) { + return ""; + } + try { + return URLEncoder.encode(s, ENCODING) + // OAuth encodes some characters differently: + .replace("+", "%20").replace("*", "%2A") + .replace("%7E", "~"); + // This could be done faster with more hand-crafted code. + } catch (UnsupportedEncodingException wow) { + throw new RuntimeException(wow.getMessage(), wow); + } + } + + private static @Nullable String rfc6570ItemValue(@Nullable Object item, boolean percentEncode) { + /* + Get representation if str/float/int/None/items in list/ values in dict + None is returned if an item is undefined, use cases are value= + - None + - [] + - {} + - [None, None None] + - {'a': None, 'b': None} + */ + if (item instanceof String stringItem) { + if (percentEncode) { + return percentEncode(stringItem); + } + return stringItem; + } else if (item instanceof Number numberItem) { + return numberItem.toString(); + } else if (item == null) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } else if (item instanceof List && ((List) item).isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } else if (item instanceof Map && ((Map) item).isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } + throw new InvalidTypeException("Unable to generate a rfc6570 item representation of "+item); + } + + private static String rfc6570StrNumberExpansion( + @Nullable Object inData, + boolean percentEncode, + PrefixSeparatorIterator prefixSeparatorIterator, + String varNamePiece, + boolean namedParameterExpansion + ) { + var itemValue = rfc6570ItemValue(inData, percentEncode); + if (itemValue == null || (itemValue.isEmpty() && prefixSeparatorIterator.separator.equals(";"))) { + return prefixSeparatorIterator.next() + varNamePiece; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + return prefixSeparatorIterator.next() + varNamePiece + valuePairEquals + itemValue; + } + + private static String rfc6570ListExpansion( + List inData, + boolean explode, + boolean percentEncode, + PrefixSeparatorIterator prefixSeparatorIterator, + String varNamePiece, + boolean namedParameterExpansion + ) { + var itemValues = inData.stream() + .map(v -> rfc6570ItemValue(v, percentEncode)) + .filter(Objects::nonNull) + .collect(toList()); + if (itemValues.isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + if (!explode) { + return ( + prefixSeparatorIterator.next() + + varNamePiece + + valuePairEquals + + String.join(prefixSeparatorIterator.itemSeparator, itemValues) + ); + } + // exploded + return prefixSeparatorIterator.next() + itemValues.stream().map(v -> varNamePiece + valuePairEquals + v).collect(Collectors.joining(prefixSeparatorIterator.next())); + } + + private static String rfc6570MapExpansion( + Map inData, + boolean explode, + boolean percentEncode, + PrefixSeparatorIterator prefixSeparatorIterator, + String varNamePiece, + boolean namedParameterExpansion + ) { + var inDataMap = inData.entrySet().stream() + .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), rfc6570ItemValue(entry.getValue(), percentEncode))) + .filter(entry -> entry.getValue() != null) + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new)); + + if (inDataMap.isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + if (!explode) { + return prefixSeparatorIterator.next() + + varNamePiece + + valuePairEquals + + inDataMap.entrySet().stream().map(e -> e.getKey()+prefixSeparatorIterator.itemSeparator+e.getValue()).collect(Collectors.joining(prefixSeparatorIterator.itemSeparator)); + } + // exploded + return prefixSeparatorIterator.next() + inDataMap.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining(prefixSeparatorIterator.next())); + } + + protected static String rfc6570Expansion( + String variableName, + @Nullable Object inData, + boolean explode, + boolean percentEncode, + PrefixSeparatorIterator prefixSeparatorIterator + ) { + /* + Separator is for separate variables like dict with explode true, + not for array item separation + */ + var namedParameterExpansion = namedParameterSeparators.contains(prefixSeparatorIterator.separator); + var varNamePiece = namedParameterExpansion ? variableName : ""; + if (inData instanceof Number || inData instanceof String) { + return rfc6570StrNumberExpansion( + inData, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } else if (inData == null) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } else if (inData instanceof List listData) { + return rfc6570ListExpansion( + listData, + explode, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } else if (inData instanceof Map mapData) { + return rfc6570MapExpansion( + mapData, + explode, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } + // bool, bytes, etc + throw new InvalidTypeException("Unable to generate a rfc6570 representation of "+inData); + } +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java new file mode 100644 index 00000000000..c1ac0bfba37 --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java @@ -0,0 +1,95 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.contenttype.ContentTypeDeserializer; +import org.openapijsonschematools.client.parameter.ParameterStyle; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaFactory; +import org.openapijsonschematools.client.schemas.validation.UnsetAnyTypeJsonSchema; + +import java.net.http.HttpHeaders; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiPredicate; + +public class SchemaHeader extends HeaderBase implements Header { + public final JsonSchema schema; + + public SchemaHeader(boolean required, @Nullable Boolean allowReserved, @Nullable Boolean explode, JsonSchema schema) { + super(required, ParameterStyle.SIMPLE, explode, allowReserved); + this.schema = schema; + } + + private static HttpHeaders toHeaders(String name, String value) { + Map> map = Map.of(name, List.of(value)); + BiPredicate headerFilter = (key, val) -> true; + return HttpHeaders.of(map, headerFilter); + } + + @Override + public HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) { + var castInData = validate ? schema.validate(inData, configuration) : inData; + boolean usedExplode = explode != null && explode; + var value = StyleSimpleSerializer.serializeSimple(castInData, name, usedExplode, false); + return toHeaders(name, value); + } + + private static final Set> VOID_TYPES = Set.of(Void.class); + private static final Set> BOOLEAN_TYPES = Set.of(Boolean.class); + private static final Set> NUMERIC_TYPES = Set.of( + Integer.class, + Long.class, + Float.class, + Double.class + ); + private static final Set> STRING_TYPES = Set.of(String.class); + private static final Set> LIST_TYPES = Set.of(List.class); + private static final Set> MAP_TYPES = Set.of(Map.class); + + private List<@Nullable Object> getList(JsonSchema schema, List inData) { + Class> itemsSchemaCls = schema.items == null ? UnsetAnyTypeJsonSchema.UnsetAnyTypeJsonSchema1.class : schema.items; + JsonSchema itemSchema = JsonSchemaFactory.getInstance(itemsSchemaCls); + List<@Nullable Object> castList = new ArrayList<>(); + for (String inDataItem: inData) { + @Nullable Object castInDataItem = getCastInData(itemSchema, List.of(inDataItem)); + castList.add(castInDataItem); + } + return castList; + } + + private @Nullable Object getCastInData(JsonSchema schema, List inData) { + if (schema.type == null) { + if (inData.size() == 1) { + return inData.get(0); + } + return getList(schema, inData); + } else if (schema.type.size() == 1) { + if (schema.type.equals(BOOLEAN_TYPES)) { + throw new RuntimeException("Boolean serialization is not defined in Rfc6570, there is no agreed upon way to sent a boolean, send a string enum instead"); + } else if (schema.type.equals(VOID_TYPES) && inData.size() == 1 && inData.get(0).isEmpty()) { + return null; + } else if (schema.type.equals(STRING_TYPES) && inData.size() == 1) { + return inData.get(0); + } else if (schema.type.equals(LIST_TYPES)) { + return getList(schema, inData); + } else if (schema.type.equals(MAP_TYPES)) { + throw new RuntimeException("Header map deserialization has not yet been implemented"); + } + } else if (schema.type.size() == 4 && schema.type.equals(NUMERIC_TYPES) && inData.size() == 1) { + return ContentTypeDeserializer.fromJson(inData.get(0)); + } + throw new RuntimeException("Header deserialization for schemas with multiple types has not yet been implemented"); + } + + @Override + public @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration) { + @Nullable Object castInData = getCastInData(schema, inData); + if (validate) { + return schema.validate(castInData, configuration); + } + return castInData; + } +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java new file mode 100644 index 00000000000..1c8d5d7a27d --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java @@ -0,0 +1,21 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; + +public class StyleSimpleSerializer extends Rfc6570Serializer { + public static String serializeSimple( + @Nullable Object inData, + String name, + boolean explode, + boolean percentEncode + ) { + var prefixSeparatorIterator = new PrefixSeparatorIterator("", ","); + return rfc6570Expansion( + name, + inData, + explode, + percentEncode, + prefixSeparatorIterator + ); + } +} diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java index d36fae2df8a..41a088888e8 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java @@ -2,12 +2,13 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.openapijsonschematools.client.parameter.ParameterStyle; +import org.openapijsonschematools.client.header.Header; import java.util.Map; public class Encoding { public final String contentType; - public final @Nullable Map headers; // todo change value to HeaderParameter + public final @Nullable Map headers; public final @Nullable ParameterStyle style; public final boolean explode; public final boolean allowReserved; @@ -19,7 +20,7 @@ public Encoding(String contentType) { explode = false; allowReserved = false; } - public Encoding(String contentType, @Nullable Map headers) { + public Encoding(String contentType, @Nullable Map headers) { this.contentType = contentType; this.headers = headers; style = null; diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java new file mode 100644 index 00000000000..cb8f4b18ba2 --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java @@ -0,0 +1,8 @@ +package org.openapijsonschematools.client.parameter; + +public enum ParameterInType { + QUERY, + HEADER, + PATH, + COOKIE +} \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java index e221acb164a..37fb90cd4f2 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java @@ -2,13 +2,11 @@ import java.net.http.HttpRequest; import org.checkerframework.checker.nullness.qual.Nullable; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.ToNumberPolicy; import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; +import org.openapijsonschematools.client.contenttype.ContentTypeSerializer; import java.util.Map; -import java.util.regex.Pattern; public abstract class RequestBodySerializer { /* @@ -17,31 +15,14 @@ public abstract class RequestBodySerializer { */ public final Map content; public final boolean required; - private static final Pattern jsonContentTypePattern = Pattern.compile( - "application/[^+]*[+]?(json);?.*" - ); - private static final Gson gson = new GsonBuilder() - .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) - .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) - .create(); - private static final String textPlainContentType = "text/plain"; public RequestBodySerializer(Map content, boolean required) { this.content = content; this.required = required; } - protected static boolean contentTypeIsJson(String contentType) { - return jsonContentTypePattern.matcher(contentType).find(); - } - - @SuppressWarnings("nullness") - private String toJson(@Nullable Object body) { - return gson.toJson(body); - } - private SerializedRequestBody serializeJson(String contentType, @Nullable Object body) { - String jsonText = toJson(body); + String jsonText = ContentTypeSerializer.toJson(body); return new SerializedRequestBody(contentType, HttpRequest.BodyPublishers.ofString(jsonText)); } @@ -53,9 +34,9 @@ private SerializedRequestBody serializeTextPlain(String contentType, @Nullable O } protected SerializedRequestBody serialize(String contentType, @Nullable Object body) { - if (contentTypeIsJson(contentType)) { + if (ContentTypeDetector.contentTypeIsJson(contentType)) { return serializeJson(contentType, body); - } else if (contentType.equals(textPlainContentType)) { + } else if (ContentTypeDetector.contentTypeIsTextPlain(contentType)) { return serializeTextPlain(contentType, body); } throw new RuntimeException("Serialization has not yet been implemented for contentType="+contentType+". If you need it please file a PR"); diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java new file mode 100644 index 00000000000..bbd744abebc --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java @@ -0,0 +1,35 @@ +package org.openapijsonschematools.client.response; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.header.Header; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; + +import java.net.http.HttpHeaders; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class HeadersDeserializer { + private final Map headers; + final private MapSchemaValidator headersSchema; + public HeadersDeserializer(Map headers, MapSchemaValidator headersSchema) { + this.headers = headers; + this.headersSchema = headersSchema; + } + + public OutType deserialize(HttpHeaders responseHeaders, SchemaConfiguration configuration) { + Map headersToValidate = new HashMap<>(); + for (Map.Entry> entry: responseHeaders.map().entrySet()) { + String headerName = entry.getKey(); + Header headerDeserializer = headers.get(headerName); + if (headerDeserializer == null) { + // todo put this data in headersToValidate, if only one item in list load it in, otherwise join them with commas + continue; + } + @Nullable Object headerValue = headerDeserializer.deserialize(entry.getValue(), false, configuration); + headersToValidate.put(headerName, headerValue); + } + return headersSchema.validate(headersToValidate, configuration); + } +} diff --git a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java index 5bc67aaf446..59079f9f1a1 100644 --- a/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java +++ b/samples/client/3_0_3_unit_test/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java @@ -5,7 +5,6 @@ import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Optional; -import java.util.regex.Pattern; import org.checkerframework.checker.nullness.qual.Nullable; import com.google.gson.Gson; @@ -14,18 +13,17 @@ import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; +import org.openapijsonschematools.client.contenttype.ContentTypeDeserializer; +import org.openapijsonschematools.client.header.Header; public abstract class ResponseDeserializer { public final Map content; - public final @Nullable Map headers; // todo change the value to header - private static final Pattern jsonContentTypePattern = Pattern.compile( - "application/[^+]*[+]?(json);?.*" - ); + public final @Nullable Map headers; private static final Gson gson = new GsonBuilder() .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .create(); - protected static final String textPlainContentType = "text/plain"; public ResponseDeserializer(Map content) { this.content = content; @@ -33,30 +31,22 @@ public ResponseDeserializer(Map content) { } protected abstract SealedBodyClass getBody(String contentType, byte[] body, SchemaConfiguration configuration); - protected abstract HeaderClass getHeaders(HttpHeaders headers); + protected abstract HeaderClass getHeaders(HttpHeaders headers, SchemaConfiguration configuration); protected @Nullable Object deserializeJson(byte[] body) { String bodyStr = new String(body, StandardCharsets.UTF_8); - return gson.fromJson(bodyStr, Object.class); + return ContentTypeDeserializer.fromJson(bodyStr); } protected String deserializeTextPlain(byte[] body) { return new String(body, StandardCharsets.UTF_8); } - protected static boolean contentTypeIsJson(String contentType) { - return jsonContentTypePattern.matcher(contentType).find(); - } - - protected static boolean contentTypeIsTextPlain(String contentType) { - return textPlainContentType.equals(contentType); - } - protected T deserializeBody(String contentType, byte[] body, JsonSchema schema, SchemaConfiguration configuration) { - if (contentTypeIsJson(contentType)) { + if (ContentTypeDetector.contentTypeIsJson(contentType)) { @Nullable Object bodyData = deserializeJson(body); return schema.validateAndBox(bodyData, configuration); - } else if (contentTypeIsTextPlain(contentType)) { + } else if (ContentTypeDetector.contentTypeIsTextPlain(contentType)) { String bodyData = deserializeTextPlain(body); return schema.validateAndBox(bodyData, configuration); } @@ -77,7 +67,7 @@ public DeserializedHttpResponse deserialize(HttpRe } byte[] bodyBytes = response.body(); SealedBodyClass body = getBody(contentType, bodyBytes, configuration); - HeaderClass headers = getHeaders(response.headers()); + HeaderClass headers = getHeaders(response.headers(), configuration); return new DeserializedHttpResponse<>(body, headers); } } \ No newline at end of file diff --git a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java new file mode 100644 index 00000000000..30347681cbf --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java @@ -0,0 +1,117 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.mediatype.MediaType; +import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; + +import java.net.http.HttpHeaders; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class ContentHeaderTest { + public record ParamTestCase(@Nullable Object payload, Map> expectedSerialization, @Nullable Boolean explode) { + public ParamTestCase(@Nullable Object payload, Map> expectedSerialization) { + this(payload, expectedSerialization, null); + } + } + + @Test + public void testSerialization() { + var mapPayload = new LinkedHashMap(); + mapPayload.put("R", 100); + mapPayload.put("G", 200); + mapPayload.put("B", 150); + var testCases = List.of( + new ParamTestCase( + null, + Map.of("color", List.of("null")) + ), + new ParamTestCase( + true, + Map.of("color", List.of("true")) + ), + new ParamTestCase( + false, + Map.of("color", List.of("false")) + ), + new ParamTestCase( + 1, + Map.of("color", List.of("1")) + ), + new ParamTestCase( + 3.14, + Map.of("color",List.of("3.14")) + ), + new ParamTestCase( + "blue", + Map.of("color", List.of("\"blue\"")) + ), + new ParamTestCase( + "hello world", + Map.of("color", List.of("\"hello world\"")) + ), + new ParamTestCase( + "", + Map.of("color", List.of("\"\"")) + ), + new ParamTestCase( + List.of(), + Map.of("color", List.of("[]")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("[\"blue\",\"black\",\"brown\"]")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("[\"blue\",\"black\",\"brown\"]")), + true + ), + new ParamTestCase( + Map.of(), + Map.of("color", List.of("{}")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("{\"R\":100,\"G\":200,\"B\":150}")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("{\"R\":100,\"G\":200,\"B\":150}")), + true + ) + ); + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + BiPredicate headerFilter = (key, val) -> true; + class ApplicationJsonMediaType implements MediaType { + @Override + public AnyTypeJsonSchema.AnyTypeJsonSchema1 schema() { + return AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance(); + } + + @Override + public Void encoding() { + return null; + } + } + Map> content = Map.of( + "application/json", new ApplicationJsonMediaType() + ); + for (ParamTestCase testCase: testCases) { + var header = new ContentHeader( + true, + false, + testCase.explode, + content + ); + var serialization = header.serialize(testCase.payload, "color", false, configuration); + Assert.assertEquals(HttpHeaders.of(testCase.expectedSerialization, headerFilter), serialization); + } + } +} diff --git a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java new file mode 100644 index 00000000000..7b5795bcc14 --- /dev/null +++ b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java @@ -0,0 +1,161 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.ListJsonSchema; +import org.openapijsonschematools.client.schemas.NullJsonSchema; +import org.openapijsonschematools.client.schemas.NumberJsonSchema; +import org.openapijsonschematools.client.schemas.StringJsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; + +import java.net.http.HttpHeaders; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiPredicate; + +public class SchemaHeaderTest { + public record ParamTestCase(@Nullable Object payload, Map> expectedSerialization, @Nullable Boolean explode) { + public ParamTestCase(@Nullable Object payload, Map> expectedSerialization) { + this(payload, expectedSerialization, null); + } + } + + @Test + public void testSerialization() { + var mapPayload = new LinkedHashMap(); + mapPayload.put("R", 100); + mapPayload.put("G", 200); + mapPayload.put("B", 150); + var testCases = List.of( + new ParamTestCase( + null, + Map.of("color", List.of("")) + ), + new ParamTestCase( + 1, + Map.of("color", List.of("1")) + ), + new ParamTestCase( + 3.14, + Map.of("color",List.of("3.14")) + ), + new ParamTestCase( + "blue", + Map.of("color", List.of("blue")) + ), + new ParamTestCase( + "hello world", + Map.of("color", List.of("hello world")) + ), + new ParamTestCase( + "", + Map.of("color", List.of("")) + ), + new ParamTestCase( + List.of(), + Map.of("color", List.of("")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("blue,black,brown")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("blue,black,brown")), + true + ), + new ParamTestCase( + Map.of(), + Map.of("color", List.of("")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("R,100,G,200,B,150")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("R=100,G=200,B=150")), + true + ) + ); + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + BiPredicate headerFilter = (key, val) -> true; + for (ParamTestCase testCase: testCases) { + var header = new SchemaHeader( + true, + false, + testCase.explode, + AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance() + ); + var serialization = header.serialize(testCase.payload, "color", false, configuration); + Assert.assertEquals(HttpHeaders.of(testCase.expectedSerialization, headerFilter), serialization); + } + SchemaHeader boolHeader = new SchemaHeader( + true, + false, + false, + AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance() + ); + for (boolean value: Set.of(true, false)) { + Assert.assertThrows( + InvalidTypeException.class, + () -> boolHeader.serialize(value, "color", false, configuration) + ); + } + } + + private static SchemaHeader getHeader(JsonSchema schema) { + return new SchemaHeader( + true, + false, + false, + schema + ); + } + + @SuppressWarnings("nullness") + private void assertNull(@Nullable Object object) { + Assert.assertNull(object); + } + + @Test + public void testDeserialization() { + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + + SchemaHeader header = getHeader(NullJsonSchema.NullJsonSchema1.getInstance()); + var deserialized = header.deserialize(List.of(""), false, configuration); + assertNull(deserialized); + + header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("1"), false, configuration); + @Nullable Object expected = 1L; + Assert.assertEquals(expected, deserialized); + + header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("3.14"), false, configuration); + expected = 3.14d; + Assert.assertEquals(expected, deserialized); + + header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("blue"), false, configuration); + expected = "blue"; + Assert.assertEquals(expected, deserialized); + + header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("hello world"), false, configuration); + expected = "hello world"; + Assert.assertEquals(expected, deserialized); + + header = getHeader(ListJsonSchema.ListJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("blue", "black", "brown"), false, configuration); + expected = List.of("blue", "black", "brown"); + Assert.assertEquals(expected, deserialized); + } +} diff --git a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java index 250d1e0f530..9f0c86ec5c4 100644 --- a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java +++ b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java @@ -2,6 +2,7 @@ import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; import org.openapijsonschematools.client.schemas.StringJsonSchema; @@ -58,13 +59,13 @@ public SerializedRequestBody serialize(SealedRequestBody requestBody) { @Test public void testContentTypeIsJson() { - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json; charset=UTF-8")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json-patch+json")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/geo+json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json; charset=UTF-8")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json-patch+json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/geo+json")); - Assert.assertFalse(RequestBodySerializer.contentTypeIsJson("application/octet-stream")); - Assert.assertFalse(RequestBodySerializer.contentTypeIsJson("text/plain")); + Assert.assertFalse(ContentTypeDetector.contentTypeIsJson("application/octet-stream")); + Assert.assertFalse(ContentTypeDetector.contentTypeIsJson("text/plain")); } static final class StringSubscriber implements Flow.Subscriber { diff --git a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java index 76dc7f0165f..408f04582a8 100644 --- a/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java +++ b/samples/client/3_0_3_unit_test/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java @@ -80,7 +80,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES b/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES index c4948dce9a5..c6f22597bf3 100644 --- a/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES +++ b/samples/client/3_1_0_unit_test/java/.openapi-generator/FILES @@ -291,20 +291,32 @@ src/main/java/org/openapijsonschematools/client/components/schemas/ValidateAgain src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java src/main/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlags.java src/main/java/org/openapijsonschematools/client/configurations/SchemaConfiguration.java +src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java +src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java +src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java src/main/java/org/openapijsonschematools/client/exceptions/ApiException.java src/main/java/org/openapijsonschematools/client/exceptions/BaseException.java src/main/java/org/openapijsonschematools/client/exceptions/InvalidAdditionalPropertyException.java src/main/java/org/openapijsonschematools/client/exceptions/InvalidTypeException.java src/main/java/org/openapijsonschematools/client/exceptions/UnsetPropertyException.java src/main/java/org/openapijsonschematools/client/exceptions/ValidationException.java +src/main/java/org/openapijsonschematools/client/header/ContentHeader.java +src/main/java/org/openapijsonschematools/client/header/Header.java +src/main/java/org/openapijsonschematools/client/header/HeaderBase.java +src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java +src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java +src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java +src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java src/main/java/org/openapijsonschematools/client/mediatype/MediaType.java +src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java src/main/java/org/openapijsonschematools/client/parameter/ParameterStyle.java src/main/java/org/openapijsonschematools/client/requestbody/GenericRequestBody.java src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java src/main/java/org/openapijsonschematools/client/requestbody/SerializedRequestBody.java src/main/java/org/openapijsonschematools/client/response/ApiResponse.java src/main/java/org/openapijsonschematools/client/response/DeserializedHttpResponse.java +src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java src/main/java/org/openapijsonschematools/client/response/ResponsesDeserializer.java src/main/java/org/openapijsonschematools/client/schemas/AnyTypeJsonSchema.java @@ -408,6 +420,8 @@ src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java src/test/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlagsTest.java +src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java +src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java src/test/java/org/openapijsonschematools/client/schemas/AnyTypeSchemaTest.java diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java new file mode 100644 index 00000000000..f9ef315ea84 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.contenttype; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class ContentTypeDeserializer { + private static final Gson gson = new GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .create(); + + @SuppressWarnings("nullness") + public static @Nullable Object fromJson(String json) { + return gson.fromJson(json, Object.class); + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java new file mode 100644 index 00000000000..6625c193f6a --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.contenttype; + +import java.util.regex.Pattern; + +public class ContentTypeDetector { + private static final Pattern jsonContentTypePattern = Pattern.compile( + "application/[^+]*[+]?(json);?.*" + ); + private static final String textPlainContentType = "text/plain"; + + public static boolean contentTypeIsJson(String contentType) { + return jsonContentTypePattern.matcher(contentType).find(); + } + + public static boolean contentTypeIsTextPlain(String contentType) { + return textPlainContentType.equals(contentType); + } +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java new file mode 100644 index 00000000000..51bcdeeddaf --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.contenttype; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class ContentTypeSerializer { + private static final Gson gson = new GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .create(); + + @SuppressWarnings("nullness") + public static String toJson(@Nullable Object body) { + return gson.toJson(body); + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java new file mode 100644 index 00000000000..2b09f2f77df --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/ContentHeader.java @@ -0,0 +1,62 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; +import org.openapijsonschematools.client.contenttype.ContentTypeSerializer; +import org.openapijsonschematools.client.contenttype.ContentTypeDeserializer; +import org.openapijsonschematools.client.mediatype.MediaType; +import org.openapijsonschematools.client.parameter.ParameterStyle; + +import java.net.http.HttpHeaders; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class ContentHeader extends HeaderBase implements Header { + public final Map> content; + + public ContentHeader(boolean required, @Nullable Boolean allowReserved, @Nullable Boolean explode, Map> content) { + super(required, ParameterStyle.SIMPLE, explode, allowReserved); + this.content = content; + } + + private static HttpHeaders toHeaders(String name, String value) { + Map> map = Map.of(name, List.of(value)); + BiPredicate headerFilter = (key, val) -> true; + return HttpHeaders.of(map, headerFilter); + } + + @Override + public HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) { + for (Map.Entry> entry: content.entrySet()) { + var castInData = validate ? entry.getValue().schema().validate(inData, configuration) : inData ; + String contentType = entry.getKey(); + if (ContentTypeDetector.contentTypeIsJson(contentType)) { + var value = ContentTypeSerializer.toJson(castInData); + return toHeaders(name, value); + } else { + throw new RuntimeException("Serialization of "+contentType+" has not yet been implemented"); + } + } + throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair"); + } + + @Override + public @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration) { + String inDataJoined = String.join(",", inData); // unsure if this is needed + @Nullable Object deserializedJson = ContentTypeDeserializer.fromJson(inDataJoined); + if (validate) { + for (Map.Entry> entry: content.entrySet()) { + String contentType = entry.getKey(); + if (ContentTypeDetector.contentTypeIsJson(contentType)) { + return entry.getValue().schema().validate(deserializedJson, configuration); + } else { + throw new RuntimeException("Header deserialization of "+contentType+" has not yet been implemented"); + } + } + throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair"); + } + return deserializedJson; + } +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Header.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Header.java new file mode 100644 index 00000000000..ac9f6274b0d --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Header.java @@ -0,0 +1,12 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; + +import java.net.http.HttpHeaders; +import java.util.List; + +public interface Header { + HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration); + @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration); +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java new file mode 100644 index 00000000000..23f22ebcf39 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/HeaderBase.java @@ -0,0 +1,18 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.parameter.ParameterStyle; + +public class HeaderBase { + public final boolean required; + public final @Nullable ParameterStyle style; + public final @Nullable Boolean explode; + public final @Nullable Boolean allowReserved; + + public HeaderBase(boolean required, @Nullable ParameterStyle style, @Nullable Boolean explode, @Nullable Boolean allowReserved) { + this.required = required; + this.style = style; + this.explode = explode; + this.allowReserved = allowReserved; + } +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java new file mode 100644 index 00000000000..522e71dfce4 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java @@ -0,0 +1,27 @@ +package org.openapijsonschematools.client.header; + +import java.util.Set; + +public class PrefixSeparatorIterator { + // A class to store prefixes and separators for rfc6570 expansions + public final String prefix; + public final String separator; + private boolean first; + public final String itemSeparator; + private static final Set reusedSeparators = Set.of(".", "|", "%20"); + + public PrefixSeparatorIterator(String prefix, String separator) { + this.prefix = prefix; + this.separator = separator; + itemSeparator = reusedSeparators.contains(separator) ? separator : ","; + first = true; + } + + public String next() { + if (first) { + first = false; + return prefix; + } + return separator; + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java new file mode 100644 index 00000000000..7bac0c8a6be --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java @@ -0,0 +1,186 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.AbstractMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; + +public class Rfc6570Serializer { + private static final String ENCODING = "UTF-8"; + private static final Set namedParameterSeparators = Set.of("&", ";"); + + private static String percentEncode(String s) { + if (s == null) { + return ""; + } + try { + return URLEncoder.encode(s, ENCODING) + // OAuth encodes some characters differently: + .replace("+", "%20").replace("*", "%2A") + .replace("%7E", "~"); + // This could be done faster with more hand-crafted code. + } catch (UnsupportedEncodingException wow) { + throw new RuntimeException(wow.getMessage(), wow); + } + } + + private static @Nullable String rfc6570ItemValue(@Nullable Object item, boolean percentEncode) { + /* + Get representation if str/float/int/None/items in list/ values in dict + None is returned if an item is undefined, use cases are value= + - None + - [] + - {} + - [None, None None] + - {'a': None, 'b': None} + */ + if (item instanceof String stringItem) { + if (percentEncode) { + return percentEncode(stringItem); + } + return stringItem; + } else if (item instanceof Number numberItem) { + return numberItem.toString(); + } else if (item == null) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } else if (item instanceof List && ((List) item).isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } else if (item instanceof Map && ((Map) item).isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return null; + } + throw new InvalidTypeException("Unable to generate a rfc6570 item representation of "+item); + } + + private static String rfc6570StrNumberExpansion( + @Nullable Object inData, + boolean percentEncode, + PrefixSeparatorIterator prefixSeparatorIterator, + String varNamePiece, + boolean namedParameterExpansion + ) { + var itemValue = rfc6570ItemValue(inData, percentEncode); + if (itemValue == null || (itemValue.isEmpty() && prefixSeparatorIterator.separator.equals(";"))) { + return prefixSeparatorIterator.next() + varNamePiece; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + return prefixSeparatorIterator.next() + varNamePiece + valuePairEquals + itemValue; + } + + private static String rfc6570ListExpansion( + List inData, + boolean explode, + boolean percentEncode, + PrefixSeparatorIterator prefixSeparatorIterator, + String varNamePiece, + boolean namedParameterExpansion + ) { + var itemValues = inData.stream() + .map(v -> rfc6570ItemValue(v, percentEncode)) + .filter(Objects::nonNull) + .collect(toList()); + if (itemValues.isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + if (!explode) { + return ( + prefixSeparatorIterator.next() + + varNamePiece + + valuePairEquals + + String.join(prefixSeparatorIterator.itemSeparator, itemValues) + ); + } + // exploded + return prefixSeparatorIterator.next() + itemValues.stream().map(v -> varNamePiece + valuePairEquals + v).collect(Collectors.joining(prefixSeparatorIterator.next())); + } + + private static String rfc6570MapExpansion( + Map inData, + boolean explode, + boolean percentEncode, + PrefixSeparatorIterator prefixSeparatorIterator, + String varNamePiece, + boolean namedParameterExpansion + ) { + var inDataMap = inData.entrySet().stream() + .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), rfc6570ItemValue(entry.getValue(), percentEncode))) + .filter(entry -> entry.getValue() != null) + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new)); + + if (inDataMap.isEmpty()) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } + var valuePairEquals = namedParameterExpansion ? "=" : ""; + if (!explode) { + return prefixSeparatorIterator.next() + + varNamePiece + + valuePairEquals + + inDataMap.entrySet().stream().map(e -> e.getKey()+prefixSeparatorIterator.itemSeparator+e.getValue()).collect(Collectors.joining(prefixSeparatorIterator.itemSeparator)); + } + // exploded + return prefixSeparatorIterator.next() + inDataMap.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining(prefixSeparatorIterator.next())); + } + + protected static String rfc6570Expansion( + String variableName, + @Nullable Object inData, + boolean explode, + boolean percentEncode, + PrefixSeparatorIterator prefixSeparatorIterator + ) { + /* + Separator is for separate variables like dict with explode true, + not for array item separation + */ + var namedParameterExpansion = namedParameterSeparators.contains(prefixSeparatorIterator.separator); + var varNamePiece = namedParameterExpansion ? variableName : ""; + if (inData instanceof Number || inData instanceof String) { + return rfc6570StrNumberExpansion( + inData, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } else if (inData == null) { + // ignored by the expansion process https://datatracker.ietf.org/doc/html/rfc6570#section-3.2.1 + return ""; + } else if (inData instanceof List listData) { + return rfc6570ListExpansion( + listData, + explode, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } else if (inData instanceof Map mapData) { + return rfc6570MapExpansion( + mapData, + explode, + percentEncode, + prefixSeparatorIterator, + varNamePiece, + namedParameterExpansion + ); + } + // bool, bytes, etc + throw new InvalidTypeException("Unable to generate a rfc6570 representation of "+inData); + } +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java new file mode 100644 index 00000000000..c1ac0bfba37 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java @@ -0,0 +1,95 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.contenttype.ContentTypeDeserializer; +import org.openapijsonschematools.client.parameter.ParameterStyle; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchemaFactory; +import org.openapijsonschematools.client.schemas.validation.UnsetAnyTypeJsonSchema; + +import java.net.http.HttpHeaders; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiPredicate; + +public class SchemaHeader extends HeaderBase implements Header { + public final JsonSchema schema; + + public SchemaHeader(boolean required, @Nullable Boolean allowReserved, @Nullable Boolean explode, JsonSchema schema) { + super(required, ParameterStyle.SIMPLE, explode, allowReserved); + this.schema = schema; + } + + private static HttpHeaders toHeaders(String name, String value) { + Map> map = Map.of(name, List.of(value)); + BiPredicate headerFilter = (key, val) -> true; + return HttpHeaders.of(map, headerFilter); + } + + @Override + public HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) { + var castInData = validate ? schema.validate(inData, configuration) : inData; + boolean usedExplode = explode != null && explode; + var value = StyleSimpleSerializer.serializeSimple(castInData, name, usedExplode, false); + return toHeaders(name, value); + } + + private static final Set> VOID_TYPES = Set.of(Void.class); + private static final Set> BOOLEAN_TYPES = Set.of(Boolean.class); + private static final Set> NUMERIC_TYPES = Set.of( + Integer.class, + Long.class, + Float.class, + Double.class + ); + private static final Set> STRING_TYPES = Set.of(String.class); + private static final Set> LIST_TYPES = Set.of(List.class); + private static final Set> MAP_TYPES = Set.of(Map.class); + + private List<@Nullable Object> getList(JsonSchema schema, List inData) { + Class> itemsSchemaCls = schema.items == null ? UnsetAnyTypeJsonSchema.UnsetAnyTypeJsonSchema1.class : schema.items; + JsonSchema itemSchema = JsonSchemaFactory.getInstance(itemsSchemaCls); + List<@Nullable Object> castList = new ArrayList<>(); + for (String inDataItem: inData) { + @Nullable Object castInDataItem = getCastInData(itemSchema, List.of(inDataItem)); + castList.add(castInDataItem); + } + return castList; + } + + private @Nullable Object getCastInData(JsonSchema schema, List inData) { + if (schema.type == null) { + if (inData.size() == 1) { + return inData.get(0); + } + return getList(schema, inData); + } else if (schema.type.size() == 1) { + if (schema.type.equals(BOOLEAN_TYPES)) { + throw new RuntimeException("Boolean serialization is not defined in Rfc6570, there is no agreed upon way to sent a boolean, send a string enum instead"); + } else if (schema.type.equals(VOID_TYPES) && inData.size() == 1 && inData.get(0).isEmpty()) { + return null; + } else if (schema.type.equals(STRING_TYPES) && inData.size() == 1) { + return inData.get(0); + } else if (schema.type.equals(LIST_TYPES)) { + return getList(schema, inData); + } else if (schema.type.equals(MAP_TYPES)) { + throw new RuntimeException("Header map deserialization has not yet been implemented"); + } + } else if (schema.type.size() == 4 && schema.type.equals(NUMERIC_TYPES) && inData.size() == 1) { + return ContentTypeDeserializer.fromJson(inData.get(0)); + } + throw new RuntimeException("Header deserialization for schemas with multiple types has not yet been implemented"); + } + + @Override + public @Nullable Object deserialize(List inData, boolean validate, SchemaConfiguration configuration) { + @Nullable Object castInData = getCastInData(schema, inData); + if (validate) { + return schema.validate(castInData, configuration); + } + return castInData; + } +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java new file mode 100644 index 00000000000..1c8d5d7a27d --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java @@ -0,0 +1,21 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; + +public class StyleSimpleSerializer extends Rfc6570Serializer { + public static String serializeSimple( + @Nullable Object inData, + String name, + boolean explode, + boolean percentEncode + ) { + var prefixSeparatorIterator = new PrefixSeparatorIterator("", ","); + return rfc6570Expansion( + name, + inData, + explode, + percentEncode, + prefixSeparatorIterator + ); + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java index d36fae2df8a..41a088888e8 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java @@ -2,12 +2,13 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.openapijsonschematools.client.parameter.ParameterStyle; +import org.openapijsonschematools.client.header.Header; import java.util.Map; public class Encoding { public final String contentType; - public final @Nullable Map headers; // todo change value to HeaderParameter + public final @Nullable Map headers; public final @Nullable ParameterStyle style; public final boolean explode; public final boolean allowReserved; @@ -19,7 +20,7 @@ public Encoding(String contentType) { explode = false; allowReserved = false; } - public Encoding(String contentType, @Nullable Map headers) { + public Encoding(String contentType, @Nullable Map headers) { this.contentType = contentType; this.headers = headers; style = null; diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java new file mode 100644 index 00000000000..cb8f4b18ba2 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java @@ -0,0 +1,8 @@ +package org.openapijsonschematools.client.parameter; + +public enum ParameterInType { + QUERY, + HEADER, + PATH, + COOKIE +} \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java index e221acb164a..37fb90cd4f2 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java @@ -2,13 +2,11 @@ import java.net.http.HttpRequest; import org.checkerframework.checker.nullness.qual.Nullable; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.ToNumberPolicy; import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; +import org.openapijsonschematools.client.contenttype.ContentTypeSerializer; import java.util.Map; -import java.util.regex.Pattern; public abstract class RequestBodySerializer { /* @@ -17,31 +15,14 @@ public abstract class RequestBodySerializer { */ public final Map content; public final boolean required; - private static final Pattern jsonContentTypePattern = Pattern.compile( - "application/[^+]*[+]?(json);?.*" - ); - private static final Gson gson = new GsonBuilder() - .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) - .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) - .create(); - private static final String textPlainContentType = "text/plain"; public RequestBodySerializer(Map content, boolean required) { this.content = content; this.required = required; } - protected static boolean contentTypeIsJson(String contentType) { - return jsonContentTypePattern.matcher(contentType).find(); - } - - @SuppressWarnings("nullness") - private String toJson(@Nullable Object body) { - return gson.toJson(body); - } - private SerializedRequestBody serializeJson(String contentType, @Nullable Object body) { - String jsonText = toJson(body); + String jsonText = ContentTypeSerializer.toJson(body); return new SerializedRequestBody(contentType, HttpRequest.BodyPublishers.ofString(jsonText)); } @@ -53,9 +34,9 @@ private SerializedRequestBody serializeTextPlain(String contentType, @Nullable O } protected SerializedRequestBody serialize(String contentType, @Nullable Object body) { - if (contentTypeIsJson(contentType)) { + if (ContentTypeDetector.contentTypeIsJson(contentType)) { return serializeJson(contentType, body); - } else if (contentType.equals(textPlainContentType)) { + } else if (ContentTypeDetector.contentTypeIsTextPlain(contentType)) { return serializeTextPlain(contentType, body); } throw new RuntimeException("Serialization has not yet been implemented for contentType="+contentType+". If you need it please file a PR"); diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java new file mode 100644 index 00000000000..bbd744abebc --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java @@ -0,0 +1,35 @@ +package org.openapijsonschematools.client.response; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.header.Header; +import org.openapijsonschematools.client.schemas.validation.MapSchemaValidator; + +import java.net.http.HttpHeaders; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class HeadersDeserializer { + private final Map headers; + final private MapSchemaValidator headersSchema; + public HeadersDeserializer(Map headers, MapSchemaValidator headersSchema) { + this.headers = headers; + this.headersSchema = headersSchema; + } + + public OutType deserialize(HttpHeaders responseHeaders, SchemaConfiguration configuration) { + Map headersToValidate = new HashMap<>(); + for (Map.Entry> entry: responseHeaders.map().entrySet()) { + String headerName = entry.getKey(); + Header headerDeserializer = headers.get(headerName); + if (headerDeserializer == null) { + // todo put this data in headersToValidate, if only one item in list load it in, otherwise join them with commas + continue; + } + @Nullable Object headerValue = headerDeserializer.deserialize(entry.getValue(), false, configuration); + headersToValidate.put(headerName, headerValue); + } + return headersSchema.validate(headersToValidate, configuration); + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java index 5bc67aaf446..59079f9f1a1 100644 --- a/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java +++ b/samples/client/3_1_0_unit_test/java/src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java @@ -5,7 +5,6 @@ import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Optional; -import java.util.regex.Pattern; import org.checkerframework.checker.nullness.qual.Nullable; import com.google.gson.Gson; @@ -14,18 +13,17 @@ import org.openapijsonschematools.client.configurations.SchemaConfiguration; import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; +import org.openapijsonschematools.client.contenttype.ContentTypeDeserializer; +import org.openapijsonschematools.client.header.Header; public abstract class ResponseDeserializer { public final Map content; - public final @Nullable Map headers; // todo change the value to header - private static final Pattern jsonContentTypePattern = Pattern.compile( - "application/[^+]*[+]?(json);?.*" - ); + public final @Nullable Map headers; private static final Gson gson = new GsonBuilder() .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .create(); - protected static final String textPlainContentType = "text/plain"; public ResponseDeserializer(Map content) { this.content = content; @@ -33,30 +31,22 @@ public ResponseDeserializer(Map content) { } protected abstract SealedBodyClass getBody(String contentType, byte[] body, SchemaConfiguration configuration); - protected abstract HeaderClass getHeaders(HttpHeaders headers); + protected abstract HeaderClass getHeaders(HttpHeaders headers, SchemaConfiguration configuration); protected @Nullable Object deserializeJson(byte[] body) { String bodyStr = new String(body, StandardCharsets.UTF_8); - return gson.fromJson(bodyStr, Object.class); + return ContentTypeDeserializer.fromJson(bodyStr); } protected String deserializeTextPlain(byte[] body) { return new String(body, StandardCharsets.UTF_8); } - protected static boolean contentTypeIsJson(String contentType) { - return jsonContentTypePattern.matcher(contentType).find(); - } - - protected static boolean contentTypeIsTextPlain(String contentType) { - return textPlainContentType.equals(contentType); - } - protected T deserializeBody(String contentType, byte[] body, JsonSchema schema, SchemaConfiguration configuration) { - if (contentTypeIsJson(contentType)) { + if (ContentTypeDetector.contentTypeIsJson(contentType)) { @Nullable Object bodyData = deserializeJson(body); return schema.validateAndBox(bodyData, configuration); - } else if (contentTypeIsTextPlain(contentType)) { + } else if (ContentTypeDetector.contentTypeIsTextPlain(contentType)) { String bodyData = deserializeTextPlain(body); return schema.validateAndBox(bodyData, configuration); } @@ -77,7 +67,7 @@ public DeserializedHttpResponse deserialize(HttpRe } byte[] bodyBytes = response.body(); SealedBodyClass body = getBody(contentType, bodyBytes, configuration); - HeaderClass headers = getHeaders(response.headers()); + HeaderClass headers = getHeaders(response.headers(), configuration); return new DeserializedHttpResponse<>(body, headers); } } \ No newline at end of file diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java new file mode 100644 index 00000000000..30347681cbf --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java @@ -0,0 +1,117 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.mediatype.MediaType; +import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; + +import java.net.http.HttpHeaders; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiPredicate; + +public class ContentHeaderTest { + public record ParamTestCase(@Nullable Object payload, Map> expectedSerialization, @Nullable Boolean explode) { + public ParamTestCase(@Nullable Object payload, Map> expectedSerialization) { + this(payload, expectedSerialization, null); + } + } + + @Test + public void testSerialization() { + var mapPayload = new LinkedHashMap(); + mapPayload.put("R", 100); + mapPayload.put("G", 200); + mapPayload.put("B", 150); + var testCases = List.of( + new ParamTestCase( + null, + Map.of("color", List.of("null")) + ), + new ParamTestCase( + true, + Map.of("color", List.of("true")) + ), + new ParamTestCase( + false, + Map.of("color", List.of("false")) + ), + new ParamTestCase( + 1, + Map.of("color", List.of("1")) + ), + new ParamTestCase( + 3.14, + Map.of("color",List.of("3.14")) + ), + new ParamTestCase( + "blue", + Map.of("color", List.of("\"blue\"")) + ), + new ParamTestCase( + "hello world", + Map.of("color", List.of("\"hello world\"")) + ), + new ParamTestCase( + "", + Map.of("color", List.of("\"\"")) + ), + new ParamTestCase( + List.of(), + Map.of("color", List.of("[]")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("[\"blue\",\"black\",\"brown\"]")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("[\"blue\",\"black\",\"brown\"]")), + true + ), + new ParamTestCase( + Map.of(), + Map.of("color", List.of("{}")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("{\"R\":100,\"G\":200,\"B\":150}")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("{\"R\":100,\"G\":200,\"B\":150}")), + true + ) + ); + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + BiPredicate headerFilter = (key, val) -> true; + class ApplicationJsonMediaType implements MediaType { + @Override + public AnyTypeJsonSchema.AnyTypeJsonSchema1 schema() { + return AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance(); + } + + @Override + public Void encoding() { + return null; + } + } + Map> content = Map.of( + "application/json", new ApplicationJsonMediaType() + ); + for (ParamTestCase testCase: testCases) { + var header = new ContentHeader( + true, + false, + testCase.explode, + content + ); + var serialization = header.serialize(testCase.payload, "color", false, configuration); + Assert.assertEquals(HttpHeaders.of(testCase.expectedSerialization, headerFilter), serialization); + } + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java new file mode 100644 index 00000000000..7b5795bcc14 --- /dev/null +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java @@ -0,0 +1,161 @@ +package org.openapijsonschematools.client.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.InvalidTypeException; +import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; +import org.openapijsonschematools.client.schemas.ListJsonSchema; +import org.openapijsonschematools.client.schemas.NullJsonSchema; +import org.openapijsonschematools.client.schemas.NumberJsonSchema; +import org.openapijsonschematools.client.schemas.StringJsonSchema; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; + +import java.net.http.HttpHeaders; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiPredicate; + +public class SchemaHeaderTest { + public record ParamTestCase(@Nullable Object payload, Map> expectedSerialization, @Nullable Boolean explode) { + public ParamTestCase(@Nullable Object payload, Map> expectedSerialization) { + this(payload, expectedSerialization, null); + } + } + + @Test + public void testSerialization() { + var mapPayload = new LinkedHashMap(); + mapPayload.put("R", 100); + mapPayload.put("G", 200); + mapPayload.put("B", 150); + var testCases = List.of( + new ParamTestCase( + null, + Map.of("color", List.of("")) + ), + new ParamTestCase( + 1, + Map.of("color", List.of("1")) + ), + new ParamTestCase( + 3.14, + Map.of("color",List.of("3.14")) + ), + new ParamTestCase( + "blue", + Map.of("color", List.of("blue")) + ), + new ParamTestCase( + "hello world", + Map.of("color", List.of("hello world")) + ), + new ParamTestCase( + "", + Map.of("color", List.of("")) + ), + new ParamTestCase( + List.of(), + Map.of("color", List.of("")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("blue,black,brown")) + ), + new ParamTestCase( + List.of("blue", "black", "brown"), + Map.of("color", List.of("blue,black,brown")), + true + ), + new ParamTestCase( + Map.of(), + Map.of("color", List.of("")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("R,100,G,200,B,150")) + ), + new ParamTestCase( + mapPayload, + Map.of("color", List.of("R=100,G=200,B=150")), + true + ) + ); + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + BiPredicate headerFilter = (key, val) -> true; + for (ParamTestCase testCase: testCases) { + var header = new SchemaHeader( + true, + false, + testCase.explode, + AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance() + ); + var serialization = header.serialize(testCase.payload, "color", false, configuration); + Assert.assertEquals(HttpHeaders.of(testCase.expectedSerialization, headerFilter), serialization); + } + SchemaHeader boolHeader = new SchemaHeader( + true, + false, + false, + AnyTypeJsonSchema.AnyTypeJsonSchema1.getInstance() + ); + for (boolean value: Set.of(true, false)) { + Assert.assertThrows( + InvalidTypeException.class, + () -> boolHeader.serialize(value, "color", false, configuration) + ); + } + } + + private static SchemaHeader getHeader(JsonSchema schema) { + return new SchemaHeader( + true, + false, + false, + schema + ); + } + + @SuppressWarnings("nullness") + private void assertNull(@Nullable Object object) { + Assert.assertNull(object); + } + + @Test + public void testDeserialization() { + SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); + + SchemaHeader header = getHeader(NullJsonSchema.NullJsonSchema1.getInstance()); + var deserialized = header.deserialize(List.of(""), false, configuration); + assertNull(deserialized); + + header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("1"), false, configuration); + @Nullable Object expected = 1L; + Assert.assertEquals(expected, deserialized); + + header = getHeader(NumberJsonSchema.NumberJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("3.14"), false, configuration); + expected = 3.14d; + Assert.assertEquals(expected, deserialized); + + header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("blue"), false, configuration); + expected = "blue"; + Assert.assertEquals(expected, deserialized); + + header = getHeader(StringJsonSchema.StringJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("hello world"), false, configuration); + expected = "hello world"; + Assert.assertEquals(expected, deserialized); + + header = getHeader(ListJsonSchema.ListJsonSchema1.getInstance()); + deserialized = header.deserialize(List.of("blue", "black", "brown"), false, configuration); + expected = List.of("blue", "black", "brown"); + Assert.assertEquals(expected, deserialized); + } +} diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java index 250d1e0f530..9f0c86ec5c4 100644 --- a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java @@ -2,6 +2,7 @@ import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.contenttype.ContentTypeDetector; import org.openapijsonschematools.client.schemas.AnyTypeJsonSchema; import org.openapijsonschematools.client.schemas.StringJsonSchema; @@ -58,13 +59,13 @@ public SerializedRequestBody serialize(SealedRequestBody requestBody) { @Test public void testContentTypeIsJson() { - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json; charset=UTF-8")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/json-patch+json")); - Assert.assertTrue(RequestBodySerializer.contentTypeIsJson("application/geo+json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json; charset=UTF-8")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/json-patch+json")); + Assert.assertTrue(ContentTypeDetector.contentTypeIsJson("application/geo+json")); - Assert.assertFalse(RequestBodySerializer.contentTypeIsJson("application/octet-stream")); - Assert.assertFalse(RequestBodySerializer.contentTypeIsJson("text/plain")); + Assert.assertFalse(ContentTypeDetector.contentTypeIsJson("application/octet-stream")); + Assert.assertFalse(ContentTypeDetector.contentTypeIsJson("text/plain")); } static final class StringSubscriber implements Flow.Subscriber { diff --git a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java index 76dc7f0165f..408f04582a8 100644 --- a/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java +++ b/samples/client/3_1_0_unit_test/java/src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java @@ -80,7 +80,7 @@ protected SealedResponseBody getBody(String contentType, byte[] body, SchemaConf } @Override - protected Void getHeaders(HttpHeaders headers) { + protected Void getHeaders(HttpHeaders headers, SchemaConfiguration configuration) { return null; } } diff --git a/samples/client/petstore/python/.openapi-generator/FILES b/samples/client/petstore/python/.openapi-generator/FILES index 922904e5692..1e37b0cf188 100644 --- a/samples/client/petstore/python/.openapi-generator/FILES +++ b/samples/client/petstore/python/.openapi-generator/FILES @@ -530,8 +530,8 @@ src/petstore_api/components/request_bodies/request_body_user_array/content/appli src/petstore_api/components/request_bodies/request_body_user_array/content/application_json/schema.py src/petstore_api/components/responses/__init__.py src/petstore_api/components/responses/response_headers_with_no_body/__init__.py +src/petstore_api/components/responses/response_headers_with_no_body/header_headers/__init__.py src/petstore_api/components/responses/response_headers_with_no_body/header_parameters.py -src/petstore_api/components/responses/response_headers_with_no_body/headers/__init__.py src/petstore_api/components/responses/response_headers_with_no_body/headers/header_location/__init__.py src/petstore_api/components/responses/response_headers_with_no_body/headers/header_location/schema.py src/petstore_api/components/responses/response_ref_success_description_only/__init__.py @@ -541,16 +541,16 @@ src/petstore_api/components/responses/response_success_inline_content_and_header src/petstore_api/components/responses/response_success_inline_content_and_header/content/__init__.py src/petstore_api/components/responses/response_success_inline_content_and_header/content/application_json/__init__.py src/petstore_api/components/responses/response_success_inline_content_and_header/content/application_json/schema.py +src/petstore_api/components/responses/response_success_inline_content_and_header/header_headers/__init__.py src/petstore_api/components/responses/response_success_inline_content_and_header/header_parameters.py -src/petstore_api/components/responses/response_success_inline_content_and_header/headers/__init__.py src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/__init__.py src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/schema.py src/petstore_api/components/responses/response_success_with_json_api_response/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/content/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/content/application_json/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/content/application_json/schema.py +src/petstore_api/components/responses/response_success_with_json_api_response/header_headers/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py -src/petstore_api/components/responses/response_success_with_json_api_response/headers/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/headers/header_int32/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/headers/header_number_header/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/headers/header_ref_content_schema_header/__init__.py @@ -1533,8 +1533,8 @@ src/petstore_api/paths/user_login/get/responses/response_200/content/application src/petstore_api/paths/user_login/get/responses/response_200/content/application_json/schema.py src/petstore_api/paths/user_login/get/responses/response_200/content/application_xml/__init__.py src/petstore_api/paths/user_login/get/responses/response_200/content/application_xml/schema.py +src/petstore_api/paths/user_login/get/responses/response_200/header_headers/__init__.py src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py -src/petstore_api/paths/user_login/get/responses/response_200/headers/__init__.py src/petstore_api/paths/user_login/get/responses/response_200/headers/header_int32/__init__.py src/petstore_api/paths/user_login/get/responses/response_200/headers/header_number_header/__init__.py src/petstore_api/paths/user_login/get/responses/response_200/headers/header_ref_content_schema_header/__init__.py diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_headers/__init__.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_headers/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_headers/__init__.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_headers/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_headers/__init__.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_headers/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_headers/__init__.py b/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_headers/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java index 2cce7bd08f1..da1f3cf34d1 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java @@ -3824,6 +3824,10 @@ protected void updateComponentsFilepath(String[] pathPieces) { pathPieces[6] = getSchemaFilename(jsonPath); } } else if (pathPieces[4].equals("content")) { + if (pathPieces.length == 5) { + // #/components/responses/someResponse/content -> length 5 + return; + } // #/components/responses/someResponse/content/application-json -> length 6 String contentType = ModelUtils.decodeSlashes(pathPieces[5]); pathPieces[5] = toContentTypeFilename(contentType); @@ -3936,6 +3940,10 @@ private void updatePathsFilepath(String[] pathPieces) { } if (pathPieces[6].equals("content")) { + if (pathPieces.length == 7) { + // #/paths/somePath/get/responses/200/content + return; + } // #/paths/somePath/get/responses/200/content/application-json -> length 8 String contentType = ModelUtils.decodeSlashes(pathPieces[7]); pathPieces[7] = toContentTypeFilename(contentType); diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java index 0a125973aec..b2db2b73472 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/JavaClientGenerator.java @@ -285,7 +285,8 @@ public JavaClientGenerator() { DocumentationFeature.ComponentSchemas, DocumentationFeature.ComponentSecuritySchemes, DocumentationFeature.ComponentRequestBodies, - DocumentationFeature.ComponentResponses + DocumentationFeature.ComponentResponses, + DocumentationFeature.ComponentHeaders ) .includeGlobalFeatures( GlobalFeature.Components, @@ -296,7 +297,8 @@ public JavaClientGenerator() { ComponentsFeature.schemas, ComponentsFeature.securitySchemes, ComponentsFeature.requestBodies, - ComponentsFeature.responses + ComponentsFeature.responses, + ComponentsFeature.headers ) .includeSecurityFeatures( SecurityFeature.ApiKey, @@ -305,7 +307,11 @@ public JavaClientGenerator() { ) .includeOperationFeatures( OperationFeature.Security, - OperationFeature.Servers + OperationFeature.Servers, + OperationFeature.Responses_Default, + OperationFeature.Responses_HttpStatusCode, + OperationFeature.Responses_RangedResponseCodes, + OperationFeature.Responses_RedirectionResponse ) .includeSchemaFeatures( SchemaFeature.AdditionalProperties, From 5308c9bcbe1116a20641e3394c7830f998cd5e29 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 1 Mar 2024 12:44:19 -0800 Subject: [PATCH 29/32] Samples updated --- .../petstore/python/.openapi-generator/FILES | 40 +++++++++---------- .../content/application_json/schema.md | 9 +++++ .../docs/components/headers/headers/schema.md | 9 +++++ .../headers/headers/schema.md | 9 +++++ .../headers/headers/schema.md | 9 +++++ .../content/application_json/schema.py | 13 ------ .../headers/header_number_header/schema.py | 13 ------ .../content/__init__.py | 0 .../content/__init__.py | 0 .../content/application_json/schema.py | 0 .../schema.py | 0 .../header_headers/__init__.py | 0 .../header_parameters.py | 2 +- .../headers/headers}/schema.py | 0 .../header_headers/__init__.py | 0 .../header_parameters.py | 2 +- .../headers/header_some_header/schema.py | 13 ------ .../headers/headers}/schema.py | 0 .../header_headers/__init__.py | 0 .../header_parameters.py | 6 +-- .../response_200/header_headers/__init__.py | 0 .../response_200/header_parameters.py | 4 +- .../generators/PythonClientGenerator.java | 10 ++++- 23 files changed, 72 insertions(+), 67 deletions(-) create mode 100644 samples/client/petstore/python/docs/components/headers/headers/content/application_json/schema.md create mode 100644 samples/client/petstore/python/docs/components/headers/headers/schema.md create mode 100644 samples/client/petstore/python/docs/components/responses/response_headers_with_no_body/headers/headers/schema.md create mode 100644 samples/client/petstore/python/docs/components/responses/response_success_inline_content_and_header/headers/headers/schema.md delete mode 100644 samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/schema.py delete mode 100644 samples/client/petstore/python/src/petstore_api/components/headers/header_number_header/schema.py delete mode 100644 samples/client/petstore/python/src/petstore_api/components/headers/header_ref_content_schema_header/content/__init__.py rename samples/client/petstore/python/src/petstore_api/components/headers/{header_int32_json_content_type_header => headers}/content/__init__.py (100%) rename samples/client/petstore/python/src/petstore_api/components/headers/{header_ref_content_schema_header => headers}/content/application_json/schema.py (100%) rename samples/client/petstore/python/src/petstore_api/components/headers/{header_ref_schema_header => headers}/schema.py (100%) delete mode 100644 samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_headers/__init__.py rename samples/client/petstore/python/src/petstore_api/components/{headers/header_string_header => responses/response_headers_with_no_body/headers/headers}/schema.py (100%) delete mode 100644 samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_headers/__init__.py delete mode 100644 samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/schema.py rename samples/client/petstore/python/src/petstore_api/components/responses/{response_headers_with_no_body/headers/header_location => response_success_inline_content_and_header/headers/headers}/schema.py (100%) delete mode 100644 samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_headers/__init__.py delete mode 100644 samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_headers/__init__.py diff --git a/samples/client/petstore/python/.openapi-generator/FILES b/samples/client/petstore/python/.openapi-generator/FILES index 1e37b0cf188..43db3b8148e 100644 --- a/samples/client/petstore/python/.openapi-generator/FILES +++ b/samples/client/petstore/python/.openapi-generator/FILES @@ -10,16 +10,16 @@ docs/apis/tags/pet_api.md docs/apis/tags/store_api.md docs/apis/tags/user_api.md docs/components/headers/header_int32_json_content_type_header.md -docs/components/headers/header_int32_json_content_type_header/content/application_json/schema.md docs/components/headers/header_number_header.md -docs/components/headers/header_number_header/schema.md docs/components/headers/header_ref_content_schema_header.md -docs/components/headers/header_ref_content_schema_header/content/application_json/schema.md docs/components/headers/header_ref_schema_header.md -docs/components/headers/header_ref_schema_header/schema.md docs/components/headers/header_ref_string_header.md docs/components/headers/header_string_header.md -docs/components/headers/header_string_header/schema.md +docs/components/headers/headers/content/application_json/schema.md +docs/components/headers/headers/content/application_json/schema.md +docs/components/headers/headers/schema.md +docs/components/headers/headers/schema.md +docs/components/headers/headers/schema.md docs/components/parameters/parameter_component_ref_schema_string_with_validation.md docs/components/parameters/parameter_component_ref_schema_string_with_validation/content/application_json/schema.md docs/components/parameters/parameter_path_user_name.md @@ -36,13 +36,13 @@ docs/components/request_bodies/request_body_ref_user_array.md docs/components/request_bodies/request_body_user_array.md docs/components/request_bodies/request_body_user_array/content/application_json/schema.md docs/components/responses/response_headers_with_no_body.md -docs/components/responses/response_headers_with_no_body/headers/header_location/schema.md +docs/components/responses/response_headers_with_no_body/headers/headers/schema.md docs/components/responses/response_ref_success_description_only.md docs/components/responses/response_ref_successful_xml_and_json_array_of_pet.md docs/components/responses/response_success_description_only.md docs/components/responses/response_success_inline_content_and_header.md docs/components/responses/response_success_inline_content_and_header/content/application_json/schema.md -docs/components/responses/response_success_inline_content_and_header/headers/header_some_header/schema.md +docs/components/responses/response_success_inline_content_and_header/headers/headers/schema.md docs/components/responses/response_success_with_json_api_response.md docs/components/responses/response_success_with_json_api_response/content/application_json/schema.md docs/components/responses/response_successful_xml_and_json_array_of_pet.md @@ -488,20 +488,20 @@ src/petstore_api/apis/tags/user_api.py src/petstore_api/components/__init__.py src/petstore_api/components/headers/__init__.py src/petstore_api/components/headers/header_int32_json_content_type_header/__init__.py -src/petstore_api/components/headers/header_int32_json_content_type_header/content/__init__.py src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/__init__.py -src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/schema.py src/petstore_api/components/headers/header_number_header/__init__.py -src/petstore_api/components/headers/header_number_header/schema.py src/petstore_api/components/headers/header_ref_content_schema_header/__init__.py -src/petstore_api/components/headers/header_ref_content_schema_header/content/__init__.py src/petstore_api/components/headers/header_ref_content_schema_header/content/application_json/__init__.py -src/petstore_api/components/headers/header_ref_content_schema_header/content/application_json/schema.py src/petstore_api/components/headers/header_ref_schema_header/__init__.py -src/petstore_api/components/headers/header_ref_schema_header/schema.py src/petstore_api/components/headers/header_ref_string_header/__init__.py src/petstore_api/components/headers/header_string_header/__init__.py -src/petstore_api/components/headers/header_string_header/schema.py +src/petstore_api/components/headers/headers/content/__init__.py +src/petstore_api/components/headers/headers/content/__init__.py +src/petstore_api/components/headers/headers/content/application_json/schema.py +src/petstore_api/components/headers/headers/content/application_json/schema.py +src/petstore_api/components/headers/headers/schema.py +src/petstore_api/components/headers/headers/schema.py +src/petstore_api/components/headers/headers/schema.py src/petstore_api/components/parameters/__init__.py src/petstore_api/components/parameters/parameter_component_ref_schema_string_with_validation/__init__.py src/petstore_api/components/parameters/parameter_component_ref_schema_string_with_validation/content/__init__.py @@ -530,10 +530,10 @@ src/petstore_api/components/request_bodies/request_body_user_array/content/appli src/petstore_api/components/request_bodies/request_body_user_array/content/application_json/schema.py src/petstore_api/components/responses/__init__.py src/petstore_api/components/responses/response_headers_with_no_body/__init__.py -src/petstore_api/components/responses/response_headers_with_no_body/header_headers/__init__.py src/petstore_api/components/responses/response_headers_with_no_body/header_parameters.py +src/petstore_api/components/responses/response_headers_with_no_body/headers/__init__.py src/petstore_api/components/responses/response_headers_with_no_body/headers/header_location/__init__.py -src/petstore_api/components/responses/response_headers_with_no_body/headers/header_location/schema.py +src/petstore_api/components/responses/response_headers_with_no_body/headers/headers/schema.py src/petstore_api/components/responses/response_ref_success_description_only/__init__.py src/petstore_api/components/responses/response_ref_successful_xml_and_json_array_of_pet/__init__.py src/petstore_api/components/responses/response_success_description_only/__init__.py @@ -541,16 +541,16 @@ src/petstore_api/components/responses/response_success_inline_content_and_header src/petstore_api/components/responses/response_success_inline_content_and_header/content/__init__.py src/petstore_api/components/responses/response_success_inline_content_and_header/content/application_json/__init__.py src/petstore_api/components/responses/response_success_inline_content_and_header/content/application_json/schema.py -src/petstore_api/components/responses/response_success_inline_content_and_header/header_headers/__init__.py src/petstore_api/components/responses/response_success_inline_content_and_header/header_parameters.py +src/petstore_api/components/responses/response_success_inline_content_and_header/headers/__init__.py src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/__init__.py -src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/schema.py +src/petstore_api/components/responses/response_success_inline_content_and_header/headers/headers/schema.py src/petstore_api/components/responses/response_success_with_json_api_response/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/content/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/content/application_json/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/content/application_json/schema.py -src/petstore_api/components/responses/response_success_with_json_api_response/header_headers/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py +src/petstore_api/components/responses/response_success_with_json_api_response/headers/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/headers/header_int32/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/headers/header_number_header/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/headers/header_ref_content_schema_header/__init__.py @@ -1533,8 +1533,8 @@ src/petstore_api/paths/user_login/get/responses/response_200/content/application src/petstore_api/paths/user_login/get/responses/response_200/content/application_json/schema.py src/petstore_api/paths/user_login/get/responses/response_200/content/application_xml/__init__.py src/petstore_api/paths/user_login/get/responses/response_200/content/application_xml/schema.py -src/petstore_api/paths/user_login/get/responses/response_200/header_headers/__init__.py src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py +src/petstore_api/paths/user_login/get/responses/response_200/headers/__init__.py src/petstore_api/paths/user_login/get/responses/response_200/headers/header_int32/__init__.py src/petstore_api/paths/user_login/get/responses/response_200/headers/header_number_header/__init__.py src/petstore_api/paths/user_login/get/responses/response_200/headers/header_ref_content_schema_header/__init__.py diff --git a/samples/client/petstore/python/docs/components/headers/headers/content/application_json/schema.md b/samples/client/petstore/python/docs/components/headers/headers/content/application_json/schema.md new file mode 100644 index 00000000000..2371ebebf77 --- /dev/null +++ b/samples/client/petstore/python/docs/components/headers/headers/content/application_json/schema.md @@ -0,0 +1,9 @@ +# Schema +``` +type: schemas.Schema +``` + +## Ref Schema Info +Ref Schema | Input Type | Output Type +---------- | ---------- | ----------- +[**string_with_validation.StringWithValidation**](../../../../../../components/schema/string_with_validation.md) | str | str diff --git a/samples/client/petstore/python/docs/components/headers/headers/schema.md b/samples/client/petstore/python/docs/components/headers/headers/schema.md new file mode 100644 index 00000000000..6c4c2fa9ac2 --- /dev/null +++ b/samples/client/petstore/python/docs/components/headers/headers/schema.md @@ -0,0 +1,9 @@ +# Schema +``` +type: schemas.Schema +``` + +## Ref Schema Info +Ref Schema | Input Type | Output Type +---------- | ---------- | ----------- +[**string_with_validation.StringWithValidation**](../../../components/schema/string_with_validation.md) | str | str diff --git a/samples/client/petstore/python/docs/components/responses/response_headers_with_no_body/headers/headers/schema.md b/samples/client/petstore/python/docs/components/responses/response_headers_with_no_body/headers/headers/schema.md new file mode 100644 index 00000000000..d9270bb57c1 --- /dev/null +++ b/samples/client/petstore/python/docs/components/responses/response_headers_with_no_body/headers/headers/schema.md @@ -0,0 +1,9 @@ +# Schema +``` +type: schemas.Schema +``` + +## validate method +Input Type | Return Type | Notes +------------ | ------------- | ------------- +str | str | diff --git a/samples/client/petstore/python/docs/components/responses/response_success_inline_content_and_header/headers/headers/schema.md b/samples/client/petstore/python/docs/components/responses/response_success_inline_content_and_header/headers/headers/schema.md new file mode 100644 index 00000000000..d9270bb57c1 --- /dev/null +++ b/samples/client/petstore/python/docs/components/responses/response_success_inline_content_and_header/headers/headers/schema.md @@ -0,0 +1,9 @@ +# Schema +``` +type: schemas.Schema +``` + +## validate method +Input Type | Return Type | Notes +------------ | ------------- | ------------- +str | str | diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/schema.py b/samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/schema.py deleted file mode 100644 index 53abcaa561d..00000000000 --- a/samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/schema.py +++ /dev/null @@ -1,13 +0,0 @@ -# coding: utf-8 - -""" - OpenAPI Petstore - This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. # noqa: E501 - The version of the OpenAPI document: 1.0.0 - Generated by: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator -""" - -from __future__ import annotations -from petstore_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] - -Schema: typing_extensions.TypeAlias = schemas.Int32Schema diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/header_number_header/schema.py b/samples/client/petstore/python/src/petstore_api/components/headers/header_number_header/schema.py deleted file mode 100644 index 157fbcc46fb..00000000000 --- a/samples/client/petstore/python/src/petstore_api/components/headers/header_number_header/schema.py +++ /dev/null @@ -1,13 +0,0 @@ -# coding: utf-8 - -""" - OpenAPI Petstore - This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. # noqa: E501 - The version of the OpenAPI document: 1.0.0 - Generated by: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator -""" - -from __future__ import annotations -from petstore_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] - -Schema: typing_extensions.TypeAlias = schemas.DecimalSchema diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/header_ref_content_schema_header/content/__init__.py b/samples/client/petstore/python/src/petstore_api/components/headers/header_ref_content_schema_header/content/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/__init__.py b/samples/client/petstore/python/src/petstore_api/components/headers/headers/content/__init__.py similarity index 100% rename from samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/__init__.py rename to samples/client/petstore/python/src/petstore_api/components/headers/headers/content/__init__.py diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/header_ref_content_schema_header/content/application_json/schema.py b/samples/client/petstore/python/src/petstore_api/components/headers/headers/content/application_json/schema.py similarity index 100% rename from samples/client/petstore/python/src/petstore_api/components/headers/header_ref_content_schema_header/content/application_json/schema.py rename to samples/client/petstore/python/src/petstore_api/components/headers/headers/content/application_json/schema.py diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/header_ref_schema_header/schema.py b/samples/client/petstore/python/src/petstore_api/components/headers/headers/schema.py similarity index 100% rename from samples/client/petstore/python/src/petstore_api/components/headers/header_ref_schema_header/schema.py rename to samples/client/petstore/python/src/petstore_api/components/headers/headers/schema.py diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_headers/__init__.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_headers/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_parameters.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_parameters.py index d76aa5c59f1..27131c9a054 100644 --- a/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_parameters.py +++ b/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_parameters.py @@ -12,7 +12,7 @@ AdditionalProperties: typing_extensions.TypeAlias = schemas.NotAnyTypeSchema -from petstore_api.components.responses.response_headers_with_no_body.headers.header_location import schema +from petstore_api.components.responses.response_headers_with_no_body.headers.headers import schema Properties = typing.TypedDict( 'Properties', { diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/header_string_header/schema.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/headers/headers/schema.py similarity index 100% rename from samples/client/petstore/python/src/petstore_api/components/headers/header_string_header/schema.py rename to samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/headers/headers/schema.py diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_headers/__init__.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_headers/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_parameters.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_parameters.py index f377c06d32e..eb5228f0967 100644 --- a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_parameters.py +++ b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_parameters.py @@ -12,7 +12,7 @@ AdditionalProperties: typing_extensions.TypeAlias = schemas.NotAnyTypeSchema -from petstore_api.components.responses.response_success_inline_content_and_header.headers.header_some_header import schema +from petstore_api.components.responses.response_success_inline_content_and_header.headers.headers import schema Properties = typing.TypedDict( 'Properties', { diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/schema.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/schema.py deleted file mode 100644 index 7531b9c8277..00000000000 --- a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/schema.py +++ /dev/null @@ -1,13 +0,0 @@ -# coding: utf-8 - -""" - OpenAPI Petstore - This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. # noqa: E501 - The version of the OpenAPI document: 1.0.0 - Generated by: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator -""" - -from __future__ import annotations -from petstore_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] - -Schema: typing_extensions.TypeAlias = schemas.StrSchema diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/headers/header_location/schema.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/headers/headers/schema.py similarity index 100% rename from samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/headers/header_location/schema.py rename to samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/headers/headers/schema.py diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_headers/__init__.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_headers/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py index 95e76eaca14..f9e13053eb9 100644 --- a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py +++ b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py @@ -12,9 +12,9 @@ AdditionalProperties: typing_extensions.TypeAlias = schemas.NotAnyTypeSchema -from petstore_api.components.headers.header_int32_json_content_type_header.content.application_json import schema -from petstore_api.components.headers.header_number_header import schema as schema_3 -from petstore_api.components.headers.header_string_header import schema as schema_2 +from petstore_api.components.headers.headers import schema as schema_2 +from petstore_api.components.headers.headers import schema as schema_3 +from petstore_api.components.headers.headers.content.application_json import schema from petstore_api.components.schema import string_with_validation Properties = typing.TypedDict( 'Properties', diff --git a/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_headers/__init__.py b/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_headers/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py b/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py index 12923b59ec8..30e0546ae60 100644 --- a/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py +++ b/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py @@ -12,8 +12,8 @@ AdditionalProperties: typing_extensions.TypeAlias = schemas.NotAnyTypeSchema -from petstore_api.components.headers.header_int32_json_content_type_header.content.application_json import schema as schema_2 -from petstore_api.components.headers.header_number_header import schema as schema_4 +from petstore_api.components.headers.headers import schema as schema_4 +from petstore_api.components.headers.headers.content.application_json import schema as schema_2 from petstore_api.components.schema import string_with_validation from petstore_api.paths.user_login.get.responses.response_200.headers.header_x_expires_after import schema as schema_3 from petstore_api.paths.user_login.get.responses.response_200.headers.header_x_rate_limit.content.application_json import schema diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java index 7c887e08541..d7b4bd61fd5 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java @@ -1785,7 +1785,15 @@ public String toRequestBodyFilename(String componentName, String jsonPath) { return toModuleFilename("request_body", null); } - public String toHeaderFilename(String componentName, String jsonPath) { return toModuleFilename("header_" + componentName, null); } + public String toHeaderFilename(String componentName, String jsonPath) { + String[] pathPieces = jsonPath.split("/"); + if (pathPieces.length == 5 || pathPieces.length == 7) { + // #/components/responses/SomeResponse/headers + // #/paths/somePath/verb/responses/200/headers + return "headers"; + } + return toModuleFilename("header_" + componentName, null); + } public void setUseNose(String val) { this.useNose = Boolean.parseBoolean(val); From 52ff64dc268745229f0016dba7de429e649b0d55 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 1 Mar 2024 13:00:49 -0800 Subject: [PATCH 30/32] Sample regen to fix python header path issues --- .../petstore/python/.openapi-generator/FILES | 16 ++++++++-------- .../content/application_json/schema.py | 13 +++++++++++++ .../content/application_json/schema.py | 0 .../header_parameters.py | 2 +- .../{headers => header_location}/schema.py | 0 .../header_parameters.py | 2 +- .../{headers => header_some_header}/schema.py | 0 .../header_parameters.py | 2 +- .../responses/response_200/header_parameters.py | 2 +- .../generators/PythonClientGenerator.java | 2 +- 10 files changed, 26 insertions(+), 13 deletions(-) create mode 100644 samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/schema.py rename samples/client/petstore/python/src/petstore_api/components/headers/{headers => header_ref_content_schema_header}/content/application_json/schema.py (100%) rename samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/headers/{headers => header_location}/schema.py (100%) rename samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/headers/{headers => header_some_header}/schema.py (100%) diff --git a/samples/client/petstore/python/.openapi-generator/FILES b/samples/client/petstore/python/.openapi-generator/FILES index 43db3b8148e..8750f7563ce 100644 --- a/samples/client/petstore/python/.openapi-generator/FILES +++ b/samples/client/petstore/python/.openapi-generator/FILES @@ -10,13 +10,13 @@ docs/apis/tags/pet_api.md docs/apis/tags/store_api.md docs/apis/tags/user_api.md docs/components/headers/header_int32_json_content_type_header.md +docs/components/headers/header_int32_json_content_type_header/content/application_json/schema.md docs/components/headers/header_number_header.md docs/components/headers/header_ref_content_schema_header.md +docs/components/headers/header_ref_content_schema_header/content/application_json/schema.md docs/components/headers/header_ref_schema_header.md docs/components/headers/header_ref_string_header.md docs/components/headers/header_string_header.md -docs/components/headers/headers/content/application_json/schema.md -docs/components/headers/headers/content/application_json/schema.md docs/components/headers/headers/schema.md docs/components/headers/headers/schema.md docs/components/headers/headers/schema.md @@ -36,13 +36,13 @@ docs/components/request_bodies/request_body_ref_user_array.md docs/components/request_bodies/request_body_user_array.md docs/components/request_bodies/request_body_user_array/content/application_json/schema.md docs/components/responses/response_headers_with_no_body.md -docs/components/responses/response_headers_with_no_body/headers/headers/schema.md +docs/components/responses/response_headers_with_no_body/headers/header_location/schema.md docs/components/responses/response_ref_success_description_only.md docs/components/responses/response_ref_successful_xml_and_json_array_of_pet.md docs/components/responses/response_success_description_only.md docs/components/responses/response_success_inline_content_and_header.md docs/components/responses/response_success_inline_content_and_header/content/application_json/schema.md -docs/components/responses/response_success_inline_content_and_header/headers/headers/schema.md +docs/components/responses/response_success_inline_content_and_header/headers/header_some_header/schema.md docs/components/responses/response_success_with_json_api_response.md docs/components/responses/response_success_with_json_api_response/content/application_json/schema.md docs/components/responses/response_successful_xml_and_json_array_of_pet.md @@ -489,16 +489,16 @@ src/petstore_api/components/__init__.py src/petstore_api/components/headers/__init__.py src/petstore_api/components/headers/header_int32_json_content_type_header/__init__.py src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/__init__.py +src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/schema.py src/petstore_api/components/headers/header_number_header/__init__.py src/petstore_api/components/headers/header_ref_content_schema_header/__init__.py src/petstore_api/components/headers/header_ref_content_schema_header/content/application_json/__init__.py +src/petstore_api/components/headers/header_ref_content_schema_header/content/application_json/schema.py src/petstore_api/components/headers/header_ref_schema_header/__init__.py src/petstore_api/components/headers/header_ref_string_header/__init__.py src/petstore_api/components/headers/header_string_header/__init__.py src/petstore_api/components/headers/headers/content/__init__.py src/petstore_api/components/headers/headers/content/__init__.py -src/petstore_api/components/headers/headers/content/application_json/schema.py -src/petstore_api/components/headers/headers/content/application_json/schema.py src/petstore_api/components/headers/headers/schema.py src/petstore_api/components/headers/headers/schema.py src/petstore_api/components/headers/headers/schema.py @@ -533,7 +533,7 @@ src/petstore_api/components/responses/response_headers_with_no_body/__init__.py src/petstore_api/components/responses/response_headers_with_no_body/header_parameters.py src/petstore_api/components/responses/response_headers_with_no_body/headers/__init__.py src/petstore_api/components/responses/response_headers_with_no_body/headers/header_location/__init__.py -src/petstore_api/components/responses/response_headers_with_no_body/headers/headers/schema.py +src/petstore_api/components/responses/response_headers_with_no_body/headers/header_location/schema.py src/petstore_api/components/responses/response_ref_success_description_only/__init__.py src/petstore_api/components/responses/response_ref_successful_xml_and_json_array_of_pet/__init__.py src/petstore_api/components/responses/response_success_description_only/__init__.py @@ -544,7 +544,7 @@ src/petstore_api/components/responses/response_success_inline_content_and_header src/petstore_api/components/responses/response_success_inline_content_and_header/header_parameters.py src/petstore_api/components/responses/response_success_inline_content_and_header/headers/__init__.py src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/__init__.py -src/petstore_api/components/responses/response_success_inline_content_and_header/headers/headers/schema.py +src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/schema.py src/petstore_api/components/responses/response_success_with_json_api_response/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/content/__init__.py src/petstore_api/components/responses/response_success_with_json_api_response/content/application_json/__init__.py diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/schema.py b/samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/schema.py new file mode 100644 index 00000000000..53abcaa561d --- /dev/null +++ b/samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/schema.py @@ -0,0 +1,13 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. # noqa: E501 + The version of the OpenAPI document: 1.0.0 + Generated by: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator +""" + +from __future__ import annotations +from petstore_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] + +Schema: typing_extensions.TypeAlias = schemas.Int32Schema diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/headers/content/application_json/schema.py b/samples/client/petstore/python/src/petstore_api/components/headers/header_ref_content_schema_header/content/application_json/schema.py similarity index 100% rename from samples/client/petstore/python/src/petstore_api/components/headers/headers/content/application_json/schema.py rename to samples/client/petstore/python/src/petstore_api/components/headers/header_ref_content_schema_header/content/application_json/schema.py diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_parameters.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_parameters.py index 27131c9a054..d76aa5c59f1 100644 --- a/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_parameters.py +++ b/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/header_parameters.py @@ -12,7 +12,7 @@ AdditionalProperties: typing_extensions.TypeAlias = schemas.NotAnyTypeSchema -from petstore_api.components.responses.response_headers_with_no_body.headers.headers import schema +from petstore_api.components.responses.response_headers_with_no_body.headers.header_location import schema Properties = typing.TypedDict( 'Properties', { diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/headers/headers/schema.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/headers/header_location/schema.py similarity index 100% rename from samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/headers/headers/schema.py rename to samples/client/petstore/python/src/petstore_api/components/responses/response_headers_with_no_body/headers/header_location/schema.py diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_parameters.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_parameters.py index eb5228f0967..f377c06d32e 100644 --- a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_parameters.py +++ b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/header_parameters.py @@ -12,7 +12,7 @@ AdditionalProperties: typing_extensions.TypeAlias = schemas.NotAnyTypeSchema -from petstore_api.components.responses.response_success_inline_content_and_header.headers.headers import schema +from petstore_api.components.responses.response_success_inline_content_and_header.headers.header_some_header import schema Properties = typing.TypedDict( 'Properties', { diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/headers/headers/schema.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/schema.py similarity index 100% rename from samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/headers/headers/schema.py rename to samples/client/petstore/python/src/petstore_api/components/responses/response_success_inline_content_and_header/headers/header_some_header/schema.py diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py index f9e13053eb9..b0edaed398f 100644 --- a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py +++ b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py @@ -12,9 +12,9 @@ AdditionalProperties: typing_extensions.TypeAlias = schemas.NotAnyTypeSchema +from petstore_api.components.headers.header_int32_json_content_type_header.content.application_json import schema from petstore_api.components.headers.headers import schema as schema_2 from petstore_api.components.headers.headers import schema as schema_3 -from petstore_api.components.headers.headers.content.application_json import schema from petstore_api.components.schema import string_with_validation Properties = typing.TypedDict( 'Properties', diff --git a/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py b/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py index 30e0546ae60..95dc9e983c7 100644 --- a/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py +++ b/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py @@ -12,8 +12,8 @@ AdditionalProperties: typing_extensions.TypeAlias = schemas.NotAnyTypeSchema +from petstore_api.components.headers.header_int32_json_content_type_header.content.application_json import schema as schema_2 from petstore_api.components.headers.headers import schema as schema_4 -from petstore_api.components.headers.headers.content.application_json import schema as schema_2 from petstore_api.components.schema import string_with_validation from petstore_api.paths.user_login.get.responses.response_200.headers.header_x_expires_after import schema as schema_3 from petstore_api.paths.user_login.get.responses.response_200.headers.header_x_rate_limit.content.application_json import schema diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java index d7b4bd61fd5..a14b12786c2 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java @@ -1787,7 +1787,7 @@ public String toRequestBodyFilename(String componentName, String jsonPath) { public String toHeaderFilename(String componentName, String jsonPath) { String[] pathPieces = jsonPath.split("/"); - if (pathPieces.length == 5 || pathPieces.length == 7) { + if (pathPieces.length == 5 || pathPieces.length == 7 && pathPieces[pathPieces.length-1].equals("headers")) { // #/components/responses/SomeResponse/headers // #/paths/somePath/verb/responses/200/headers return "headers"; From d4a6d407889e1182d6693f1485f65a3565f9a013 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 1 Mar 2024 13:12:19 -0800 Subject: [PATCH 31/32] Python petstore regen --- .../codegen/generators/PythonClientGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java index a14b12786c2..ec18a567a6d 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java @@ -1787,7 +1787,7 @@ public String toRequestBodyFilename(String componentName, String jsonPath) { public String toHeaderFilename(String componentName, String jsonPath) { String[] pathPieces = jsonPath.split("/"); - if (pathPieces.length == 5 || pathPieces.length == 7 && pathPieces[pathPieces.length-1].equals("headers")) { + if (pathPieces.length == 5 || pathPieces.length == 7 && componentName.equals("headers")) { // #/components/responses/SomeResponse/headers // #/paths/somePath/verb/responses/200/headers return "headers"; From 144515f04f027d4af826a2ebe93de3fa22a54f82 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Fri, 1 Mar 2024 13:23:40 -0800 Subject: [PATCH 32/32] Python regen with header schema fix --- .../petstore/python/.openapi-generator/FILES | 16 +++++++------- .../content/__init__.py | 0 .../headers/header_number_header/schema.py | 13 +++++++++++ .../content/__init__.py | 0 .../schema.py | 0 .../headers/header_string_header/schema.py | 13 +++++++++++ .../header_parameters.py | 4 ++-- .../response_200/header_parameters.py | 2 +- .../codegen/generators/DefaultGenerator.java | 22 ++++++++++--------- .../generators/PythonClientGenerator.java | 2 +- 10 files changed, 50 insertions(+), 22 deletions(-) rename samples/client/petstore/python/src/petstore_api/components/headers/{headers => header_int32_json_content_type_header}/content/__init__.py (100%) create mode 100644 samples/client/petstore/python/src/petstore_api/components/headers/header_number_header/schema.py create mode 100644 samples/client/petstore/python/src/petstore_api/components/headers/header_ref_content_schema_header/content/__init__.py rename samples/client/petstore/python/src/petstore_api/components/headers/{headers => header_ref_schema_header}/schema.py (100%) create mode 100644 samples/client/petstore/python/src/petstore_api/components/headers/header_string_header/schema.py diff --git a/samples/client/petstore/python/.openapi-generator/FILES b/samples/client/petstore/python/.openapi-generator/FILES index 8750f7563ce..922904e5692 100644 --- a/samples/client/petstore/python/.openapi-generator/FILES +++ b/samples/client/petstore/python/.openapi-generator/FILES @@ -12,14 +12,14 @@ docs/apis/tags/user_api.md docs/components/headers/header_int32_json_content_type_header.md docs/components/headers/header_int32_json_content_type_header/content/application_json/schema.md docs/components/headers/header_number_header.md +docs/components/headers/header_number_header/schema.md docs/components/headers/header_ref_content_schema_header.md docs/components/headers/header_ref_content_schema_header/content/application_json/schema.md docs/components/headers/header_ref_schema_header.md +docs/components/headers/header_ref_schema_header/schema.md docs/components/headers/header_ref_string_header.md docs/components/headers/header_string_header.md -docs/components/headers/headers/schema.md -docs/components/headers/headers/schema.md -docs/components/headers/headers/schema.md +docs/components/headers/header_string_header/schema.md docs/components/parameters/parameter_component_ref_schema_string_with_validation.md docs/components/parameters/parameter_component_ref_schema_string_with_validation/content/application_json/schema.md docs/components/parameters/parameter_path_user_name.md @@ -488,20 +488,20 @@ src/petstore_api/apis/tags/user_api.py src/petstore_api/components/__init__.py src/petstore_api/components/headers/__init__.py src/petstore_api/components/headers/header_int32_json_content_type_header/__init__.py +src/petstore_api/components/headers/header_int32_json_content_type_header/content/__init__.py src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/__init__.py src/petstore_api/components/headers/header_int32_json_content_type_header/content/application_json/schema.py src/petstore_api/components/headers/header_number_header/__init__.py +src/petstore_api/components/headers/header_number_header/schema.py src/petstore_api/components/headers/header_ref_content_schema_header/__init__.py +src/petstore_api/components/headers/header_ref_content_schema_header/content/__init__.py src/petstore_api/components/headers/header_ref_content_schema_header/content/application_json/__init__.py src/petstore_api/components/headers/header_ref_content_schema_header/content/application_json/schema.py src/petstore_api/components/headers/header_ref_schema_header/__init__.py +src/petstore_api/components/headers/header_ref_schema_header/schema.py src/petstore_api/components/headers/header_ref_string_header/__init__.py src/petstore_api/components/headers/header_string_header/__init__.py -src/petstore_api/components/headers/headers/content/__init__.py -src/petstore_api/components/headers/headers/content/__init__.py -src/petstore_api/components/headers/headers/schema.py -src/petstore_api/components/headers/headers/schema.py -src/petstore_api/components/headers/headers/schema.py +src/petstore_api/components/headers/header_string_header/schema.py src/petstore_api/components/parameters/__init__.py src/petstore_api/components/parameters/parameter_component_ref_schema_string_with_validation/__init__.py src/petstore_api/components/parameters/parameter_component_ref_schema_string_with_validation/content/__init__.py diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/headers/content/__init__.py b/samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/__init__.py similarity index 100% rename from samples/client/petstore/python/src/petstore_api/components/headers/headers/content/__init__.py rename to samples/client/petstore/python/src/petstore_api/components/headers/header_int32_json_content_type_header/content/__init__.py diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/header_number_header/schema.py b/samples/client/petstore/python/src/petstore_api/components/headers/header_number_header/schema.py new file mode 100644 index 00000000000..157fbcc46fb --- /dev/null +++ b/samples/client/petstore/python/src/petstore_api/components/headers/header_number_header/schema.py @@ -0,0 +1,13 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. # noqa: E501 + The version of the OpenAPI document: 1.0.0 + Generated by: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator +""" + +from __future__ import annotations +from petstore_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] + +Schema: typing_extensions.TypeAlias = schemas.DecimalSchema diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/header_ref_content_schema_header/content/__init__.py b/samples/client/petstore/python/src/petstore_api/components/headers/header_ref_content_schema_header/content/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/headers/schema.py b/samples/client/petstore/python/src/petstore_api/components/headers/header_ref_schema_header/schema.py similarity index 100% rename from samples/client/petstore/python/src/petstore_api/components/headers/headers/schema.py rename to samples/client/petstore/python/src/petstore_api/components/headers/header_ref_schema_header/schema.py diff --git a/samples/client/petstore/python/src/petstore_api/components/headers/header_string_header/schema.py b/samples/client/petstore/python/src/petstore_api/components/headers/header_string_header/schema.py new file mode 100644 index 00000000000..7531b9c8277 --- /dev/null +++ b/samples/client/petstore/python/src/petstore_api/components/headers/header_string_header/schema.py @@ -0,0 +1,13 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. # noqa: E501 + The version of the OpenAPI document: 1.0.0 + Generated by: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator +""" + +from __future__ import annotations +from petstore_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] + +Schema: typing_extensions.TypeAlias = schemas.StrSchema diff --git a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py index b0edaed398f..95e76eaca14 100644 --- a/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py +++ b/samples/client/petstore/python/src/petstore_api/components/responses/response_success_with_json_api_response/header_parameters.py @@ -13,8 +13,8 @@ AdditionalProperties: typing_extensions.TypeAlias = schemas.NotAnyTypeSchema from petstore_api.components.headers.header_int32_json_content_type_header.content.application_json import schema -from petstore_api.components.headers.headers import schema as schema_2 -from petstore_api.components.headers.headers import schema as schema_3 +from petstore_api.components.headers.header_number_header import schema as schema_3 +from petstore_api.components.headers.header_string_header import schema as schema_2 from petstore_api.components.schema import string_with_validation Properties = typing.TypedDict( 'Properties', diff --git a/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py b/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py index 95dc9e983c7..12923b59ec8 100644 --- a/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py +++ b/samples/client/petstore/python/src/petstore_api/paths/user_login/get/responses/response_200/header_parameters.py @@ -13,7 +13,7 @@ AdditionalProperties: typing_extensions.TypeAlias = schemas.NotAnyTypeSchema from petstore_api.components.headers.header_int32_json_content_type_header.content.application_json import schema as schema_2 -from petstore_api.components.headers.headers import schema as schema_4 +from petstore_api.components.headers.header_number_header import schema as schema_4 from petstore_api.components.schema import string_with_validation from petstore_api.paths.user_login.get.responses.response_200.headers.header_x_expires_after import schema as schema_3 from petstore_api.paths.user_login.get.responses.response_200.headers.header_x_rate_limit.content.application_json import schema diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java index da1f3cf34d1..36892dbc45f 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/DefaultGenerator.java @@ -3755,28 +3755,30 @@ protected void updateComponentsFilepath(String[] pathPieces) { return; } if (pathPieces[2].equals("headers")) { + // #/components/headers pathPieces[3] = toHeaderFilename(pathPieces[3], jsonPath); - if (pathPieces.length >= 6 && pathPieces[4].equals("content")) { + if (pathPieces.length == 5 && pathPieces[4].equals("schema")) { + // #/components/headers/someHeader/schema + pathPieces[4] = getSchemaFilename(jsonPath); + } else if (pathPieces.length >= 6 && pathPieces[4].equals("content")) { // #/components/headers/someHeader/content/application-json -> length 6 String contentType = ModelUtils.decodeSlashes(pathPieces[5]); pathPieces[5] = toContentTypeFilename(contentType); if (pathPieces.length == 7) { pathPieces[6] = getSchemaFilename(jsonPath); } - } else if (pathPieces.length == 5 && pathPieces[4].equals("schema")) { - pathPieces[4] = getSchemaFilename(jsonPath); } } else if (pathPieces[2].equals("parameters")) { pathPieces[3] = toParameterFilename(pathPieces[3], null); - if (pathPieces.length >= 6 && pathPieces[4].equals("content")) { + if (pathPieces.length == 5 && pathPieces[4].equals("schema")) { + pathPieces[4] = getSchemaFilename(jsonPath); + } else if (pathPieces.length >= 6 && pathPieces[4].equals("content")) { // #/components/parameters/someParam/content/application-json -> length 6 String contentType = ModelUtils.decodeSlashes(pathPieces[5]); pathPieces[5] = toContentTypeFilename(contentType); if (pathPieces.length == 7) { pathPieces[6] = getSchemaFilename(jsonPath); } - } else if (pathPieces.length == 5 && pathPieces[4].equals("schema")) { - pathPieces[4] = getSchemaFilename(jsonPath); } } else if (pathPieces[2].equals(requestBodiesIdentifier)) { pathPieces[3] = toRequestBodyFilename(pathPieces[3], jsonPath); @@ -3811,7 +3813,10 @@ protected void updateComponentsFilepath(String[] pathPieces) { } // #/components/responses/someResponse/headers/SomeHeader-> length 6 pathPieces[5] = toHeaderFilename(pathPieces[5], jsonPath); - if (pathPieces.length >= 8 && pathPieces[6].equals("content")) { + if (pathPieces.length == 7 && pathPieces[6].equals("schema")) { + // #/components/responses/someResponse/headers/SomeHeader/schema + pathPieces[6] = getSchemaFilename(jsonPath); + } else if (pathPieces.length >= 8 && pathPieces[6].equals("content")) { // #/components/responses/someResponse/headers/SomeHeader/content/application-json -> length 8 String contentType = ModelUtils.decodeSlashes(pathPieces[7]); pathPieces[7] = toContentTypeFilename(contentType); @@ -3819,9 +3824,6 @@ protected void updateComponentsFilepath(String[] pathPieces) { // #/components/responses/someResponse/headers/SomeHeader/content/application-json/schema pathPieces[8] = getSchemaFilename(jsonPath); } - } else if (pathPieces.length == 7 && pathPieces[6].equals("schema")) { - // #/components/responses/someResponse/headers/SomeHeader/schema - pathPieces[6] = getSchemaFilename(jsonPath); } } else if (pathPieces[4].equals("content")) { if (pathPieces.length == 5) { diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java index ec18a567a6d..6d99be9685e 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java @@ -1787,7 +1787,7 @@ public String toRequestBodyFilename(String componentName, String jsonPath) { public String toHeaderFilename(String componentName, String jsonPath) { String[] pathPieces = jsonPath.split("/"); - if (pathPieces.length == 5 || pathPieces.length == 7 && componentName.equals("headers")) { + if ((pathPieces.length == 5 || pathPieces.length == 7) && componentName.equals("headers")) { // #/components/responses/SomeResponse/headers // #/paths/somePath/verb/responses/200/headers return "headers";