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/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index cdbb89acbeb..9491651a7ec 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 @@ -324,6 +330,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 +360,24 @@ 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/HeadersWithNoBodyHeadersSchema.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/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/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 @@ -505,14 +527,25 @@ 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 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/paths/anotherfakedummy/patch/RequestBody.java src/main/java/org/openapijsonschematools/client/paths/anotherfakedummy/patch/Responses.java @@ -916,9 +949,15 @@ 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/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/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 @@ -945,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 @@ -1066,6 +1106,8 @@ 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 src/test/java/org/openapijsonschematools/client/schemas/AnyTypeSchemaTest.java 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..17096158e3c --- /dev/null +++ b/samples/client/petstore/java/docs/components/headers/Int32JsonContentTypeHeader.md @@ -0,0 +1,59 @@ +# 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 implements Header
+ +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 | + +### 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 new file mode 100644 index 00000000000..1e5c20621d7 --- /dev/null +++ b/samples/client/petstore/java/docs/components/headers/NumberHeader.md @@ -0,0 +1,40 @@ +# 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 implements Header
+ +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() + +### 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 new file mode 100644 index 00000000000..75acdaf5189 --- /dev/null +++ b/samples/client/petstore/java/docs/components/headers/RefContentSchemaHeader.md @@ -0,0 +1,59 @@ +# 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 implements Header
+ +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 | + +### 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 new file mode 100644 index 00000000000..01228dd9849 --- /dev/null +++ b/samples/client/petstore/java/docs/components/headers/RefSchemaHeader.md @@ -0,0 +1,40 @@ +# 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 implements Header
+ +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() + +### 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/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..bdb458de989 --- /dev/null +++ b/samples/client/petstore/java/docs/components/headers/StringHeader.md @@ -0,0 +1,40 @@ +# 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 implements Header
+ +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() + +### 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/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/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.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/HeadersWithNoBody.java index 816987cc22e..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,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.HeadersWithNoBodyHeadersSchema; +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 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/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..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,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.SuccessInlineContentAndHeaderHeadersSchema; +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 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 037f0c3c1de..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,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.SuccessWithJsonApiResponseHeadersSchema; +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 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/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/components/responses/headerswithnobody/Headers.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/Headers.java index 5a4894c3c3a..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 @@ -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()) + ), + HeadersWithNoBodyHeadersSchema.HeadersWithNoBodyHeadersSchema1.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/HeadersWithNoBodyHeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersWithNoBodyHeadersSchema.java new file mode 100644 index 00000000000..d0cbaf812f0 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/headerswithnobody/HeadersWithNoBodyHeadersSchema.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 HeadersWithNoBodyHeadersSchema { + // nest classes so all schemas and input/output classes can be public + + + public static class HeadersWithNoBodyAdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { + // NotAnyTypeSchema + private static @Nullable HeadersWithNoBodyAdditionalProperties instance = null; + public static HeadersWithNoBodyAdditionalProperties getInstance() { + if (instance == null) { + instance = new HeadersWithNoBodyAdditionalProperties(); + } + return instance; + } + } + + + 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 HeadersWithNoBodyHeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return HeadersWithNoBodyHeadersSchema1.getInstance().validate(arg, configuration); + } + + public String location() throws UnsetPropertyException { + return getOrThrow("location"); + } + } + + public interface SetterForHeadersWithNoBodyLocation { + Map getInstance(); + T getBuilderAfterHeadersWithNoBodyLocation(Map instance); + + default T location(String value) { + var instance = getInstance(); + instance.put("location", value); + return getBuilderAfterHeadersWithNoBodyLocation(instance); + } + } + + public static class HeadersWithNoBodyHeadersSchemaMapBuilder implements GenericBuilder>, SetterForHeadersWithNoBodyLocation { + private final Map instance; + private static final Set knownKeys = Set.of( + "location" + ); + public Set getKnownKeys() { + return knownKeys; + } + public HeadersWithNoBodyHeadersSchemaMapBuilder() { + this.instance = new LinkedHashMap<>(); + } + public Map build() { + return instance; + } + public Map getInstance() { + return instance; + } + public HeadersWithNoBodyHeadersSchemaMapBuilder getBuilderAfterHeadersWithNoBodyLocation(Map instance) { + return this; + } + } + + + public sealed interface HeadersWithNoBodyHeadersSchema1Boxed permits HeadersWithNoBodyHeadersSchema1BoxedMap { + @Nullable Object getData(); + } + + public record HeadersWithNoBodyHeadersSchema1BoxedMap(HeadersWithNoBodyHeadersSchemaMap data) implements HeadersWithNoBodyHeadersSchema1Boxed { + @Override + public @Nullable Object getData() { + return data; + } + } + + + public static class HeadersWithNoBodyHeadersSchema1 extends JsonSchema implements MapSchemaValidator { + private static @Nullable HeadersWithNoBodyHeadersSchema1 instance = null; + + protected HeadersWithNoBodyHeadersSchema1() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("location", LocationSchema.LocationSchema1.class) + )) + .additionalProperties(HeadersWithNoBodyAdditionalProperties.class) + ); + } + + public static HeadersWithNoBodyHeadersSchema1 getInstance() { + if (instance == null) { + instance = new HeadersWithNoBodyHeadersSchema1(); + } + return instance; + } + + public HeadersWithNoBodyHeadersSchemaMap 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 HeadersWithNoBodyHeadersSchemaMap(castProperties); + } + + 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); + 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 HeadersWithNoBodyHeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + return new HeadersWithNoBodyHeadersSchema1BoxedMap(validate(arg, configuration)); + } + @Override + public HeadersWithNoBodyHeadersSchema1Boxed 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/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..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 @@ -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()) + ), + SuccessInlineContentAndHeaderHeadersSchema.SuccessInlineContentAndHeaderHeadersSchema1.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/SuccessInlineContentAndHeaderHeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/SuccessInlineContentAndHeaderHeadersSchema.java new file mode 100644 index 00000000000..227e14f64b5 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successinlinecontentandheader/SuccessInlineContentAndHeaderHeadersSchema.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 SuccessInlineContentAndHeaderHeadersSchema { + // nest classes so all schemas and input/output classes can be public + + + public static class SuccessInlineContentAndHeaderAdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { + // NotAnyTypeSchema + private static @Nullable SuccessInlineContentAndHeaderAdditionalProperties instance = null; + public static SuccessInlineContentAndHeaderAdditionalProperties getInstance() { + if (instance == null) { + instance = new SuccessInlineContentAndHeaderAdditionalProperties(); + } + return instance; + } + } + + + 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 SuccessInlineContentAndHeaderHeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return SuccessInlineContentAndHeaderHeadersSchema1.getInstance().validate(arg, configuration); + } + + public String someHeader() throws UnsetPropertyException { + return getOrThrow("someHeader"); + } + } + + public interface SetterForSuccessInlineContentAndHeaderSomeHeader { + Map getInstance(); + T getBuilderAfterSuccessInlineContentAndHeaderSomeHeader(Map instance); + + default T someHeader(String value) { + var instance = getInstance(); + instance.put("someHeader", value); + return getBuilderAfterSuccessInlineContentAndHeaderSomeHeader(instance); + } + } + + public static class SuccessInlineContentAndHeaderHeadersSchemaMapBuilder implements GenericBuilder>, SetterForSuccessInlineContentAndHeaderSomeHeader { + private final Map instance; + private static final Set knownKeys = Set.of( + "someHeader" + ); + public Set getKnownKeys() { + return knownKeys; + } + public SuccessInlineContentAndHeaderHeadersSchemaMapBuilder() { + this.instance = new LinkedHashMap<>(); + } + public Map build() { + return instance; + } + public Map getInstance() { + return instance; + } + public SuccessInlineContentAndHeaderHeadersSchemaMapBuilder getBuilderAfterSuccessInlineContentAndHeaderSomeHeader(Map instance) { + return this; + } + } + + + public sealed interface SuccessInlineContentAndHeaderHeadersSchema1Boxed permits SuccessInlineContentAndHeaderHeadersSchema1BoxedMap { + @Nullable Object getData(); + } + + public record SuccessInlineContentAndHeaderHeadersSchema1BoxedMap(SuccessInlineContentAndHeaderHeadersSchemaMap data) implements SuccessInlineContentAndHeaderHeadersSchema1Boxed { + @Override + public @Nullable Object getData() { + return data; + } + } + + + public static class SuccessInlineContentAndHeaderHeadersSchema1 extends JsonSchema implements MapSchemaValidator { + private static @Nullable SuccessInlineContentAndHeaderHeadersSchema1 instance = null; + + protected SuccessInlineContentAndHeaderHeadersSchema1() { + super(new JsonSchemaInfo() + .type(Set.of(Map.class)) + .properties(Map.ofEntries( + new PropertyEntry("someHeader", SomeHeaderSchema.SomeHeaderSchema1.class) + )) + .additionalProperties(SuccessInlineContentAndHeaderAdditionalProperties.class) + ); + } + + public static SuccessInlineContentAndHeaderHeadersSchema1 getInstance() { + if (instance == null) { + instance = new SuccessInlineContentAndHeaderHeadersSchema1(); + } + return instance; + } + + public SuccessInlineContentAndHeaderHeadersSchemaMap 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 SuccessInlineContentAndHeaderHeadersSchemaMap(castProperties); + } + + 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); + 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 SuccessInlineContentAndHeaderHeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + return new SuccessInlineContentAndHeaderHeadersSchema1BoxedMap(validate(arg, configuration)); + } + @Override + public SuccessInlineContentAndHeaderHeadersSchema1Boxed 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/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..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 @@ -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()) + ), + SuccessWithJsonApiResponseHeadersSchema.SuccessWithJsonApiResponseHeadersSchema1.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/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/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..0fd5232f8d9 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/responses/successwithjsonapiresponse/headers/NumberHeader.java @@ -0,0 +1,3 @@ +package org.openapijsonschematools.client.components.responses.successwithjsonapiresponse.headers; + +public class NumberHeader extends org.openapijsonschematools.client.components.headers.NumberHeader {} 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/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/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..2b09f2f77df --- /dev/null +++ b/samples/client/petstore/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/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..ac9f6274b0d --- /dev/null +++ b/samples/client/petstore/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/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..23f22ebcf39 --- /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/header/PrefixSeparatorIterator.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java new file mode 100644 index 00000000000..522e71dfce4 --- /dev/null +++ b/samples/client/petstore/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/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 new file mode 100644 index 00000000000..7bac0c8a6be --- /dev/null +++ b/samples/client/petstore/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/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..c1ac0bfba37 --- /dev/null +++ b/samples/client/petstore/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/petstore/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java new file mode 100644 index 00000000000..1c8d5d7a27d --- /dev/null +++ b/samples/client/petstore/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/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/parameter/ParameterInType.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java new file mode 100644 index 00000000000..cb8f4b18ba2 --- /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 +} \ No newline at end of file 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/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/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/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.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/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.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/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.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/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/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/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.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/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.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/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/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/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/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/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.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/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.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/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.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/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/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/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.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/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.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/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.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/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.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/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/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/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.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/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.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/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.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/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.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/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.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/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.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/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.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/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.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/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.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/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/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/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.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/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.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/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.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/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.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/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.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/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.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/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.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/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.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/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/petpetiduploadimage/post/Responses.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/petpetiduploadimage/post/Responses.java index 3f4b3062f18..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; @@ -16,12 +17,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, + SuccessWithJsonApiResponseHeadersSchema.SuccessWithJsonApiResponseHeadersSchemaMap headers + ) implements EndpointResponse, ApiResponse{ } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +46,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..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; @@ -16,12 +17,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, + SuccessInlineContentAndHeaderHeadersSchema.SuccessInlineContentAndHeaderHeadersSchemaMap headers + ) implements EndpointResponse, ApiResponse{ } public sealed interface StatusCodeResponseDeserializer permits StatusCode200ResponseDeserializer {} @@ -48,7 +46,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/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.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/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.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/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.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/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.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/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.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/Responses.java index d6c6fa038fe..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 @@ -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; @@ -17,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 {} @@ -52,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/userlogin/get/responses/Code200Response.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/Code200Response.java index 12156c959d9..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,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.Code200ResponseHeadersSchema; +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 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/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/userlogin/get/responses/code200response/Code200ResponseHeadersSchema.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Code200ResponseHeadersSchema.java new file mode 100644 index 00000000000..a1cff258337 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/Code200ResponseHeadersSchema.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 Code200ResponseHeadersSchema { + // nest classes so all schemas and input/output classes can be public + + + public static class Code200ResponseAdditionalProperties extends NotAnyTypeJsonSchema.NotAnyTypeJsonSchema1 { + // NotAnyTypeSchema + private static @Nullable Code200ResponseAdditionalProperties instance = null; + public static Code200ResponseAdditionalProperties getInstance() { + if (instance == null) { + instance = new Code200ResponseAdditionalProperties(); + } + return instance; + } + } + + + public static class Code200ResponseHeadersSchemaMap extends FrozenMap<@Nullable Object> { + protected Code200ResponseHeadersSchemaMap(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 Code200ResponseHeadersSchemaMap of(Map arg, SchemaConfiguration configuration) throws ValidationException { + return Code200ResponseHeadersSchema1.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 SetterForCode200ResponseXRateLimit { + Map getInstance(); + T getBuilderAfterCode200ResponseXRateLimit(Map instance); + + default T setXHyphenMinusRateHyphenMinusLimit(int value) { + var instance = getInstance(); + instance.put("X-Rate-Limit", value); + return getBuilderAfterCode200ResponseXRateLimit(instance); + } + + default T setXHyphenMinusRateHyphenMinusLimit(float value) { + var instance = getInstance(); + instance.put("X-Rate-Limit", value); + return getBuilderAfterCode200ResponseXRateLimit(instance); + } + } + + public interface SetterForCode200ResponseInt32 { + Map getInstance(); + T getBuilderAfterCode200ResponseInt32(Map instance); + + default T int32(int value) { + var instance = getInstance(); + instance.put("int32", value); + return getBuilderAfterCode200ResponseInt32(instance); + } + + default T int32(float value) { + var instance = getInstance(); + instance.put("int32", value); + return getBuilderAfterCode200ResponseInt32(instance); + } + } + + public interface SetterForCode200ResponseRefcontentschemaheader { + Map getInstance(); + T getBuilderAfterCode200ResponseRefcontentschemaheader(Map instance); + + default T setRefHyphenMinusContentHyphenMinusSchemaHyphenMinusHeader(String value) { + var instance = getInstance(); + instance.put("ref-content-schema-header", value); + return getBuilderAfterCode200ResponseRefcontentschemaheader(instance); + } + } + + public interface SetterForCode200ResponseXExpiresAfter { + Map getInstance(); + T getBuilderAfterCode200ResponseXExpiresAfter(Map instance); + + default T setXHyphenMinusExpiresHyphenMinusAfter(String value) { + var instance = getInstance(); + instance.put("X-Expires-After", value); + return getBuilderAfterCode200ResponseXExpiresAfter(instance); + } + } + + public interface SetterForCode200ResponseNumberHeader { + Map getInstance(); + T getBuilderAfterCode200ResponseNumberHeader(Map instance); + + default T numberHeader(String value) { + var instance = getInstance(); + instance.put("numberHeader", value); + return getBuilderAfterCode200ResponseNumberHeader(instance); + } + } + + public static class Code200ResponseHeadersSchemaMap000Builder implements GenericBuilder>, SetterForCode200ResponseXExpiresAfter, SetterForCode200ResponseNumberHeader { + 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 Code200ResponseHeadersSchemaMap000Builder(Map instance) { + this.instance = instance; + } + public Map build() { + return instance; + } + public Map getInstance() { + return instance; + } + public Code200ResponseHeadersSchemaMap000Builder getBuilderAfterCode200ResponseXExpiresAfter(Map instance) { + return this; + } + public Code200ResponseHeadersSchemaMap000Builder getBuilderAfterCode200ResponseNumberHeader(Map instance) { + return this; + } + } + + public static class Code200ResponseHeadersSchemaMap001Builder implements SetterForCode200ResponseRefcontentschemaheader { + private final Map instance; + public Code200ResponseHeadersSchemaMap001Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public Code200ResponseHeadersSchemaMap000Builder getBuilderAfterCode200ResponseRefcontentschemaheader(Map instance) { + return new Code200ResponseHeadersSchemaMap000Builder(instance); + } + } + + public static class Code200ResponseHeadersSchemaMap010Builder implements SetterForCode200ResponseInt32 { + private final Map instance; + public Code200ResponseHeadersSchemaMap010Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public Code200ResponseHeadersSchemaMap000Builder getBuilderAfterCode200ResponseInt32(Map instance) { + return new Code200ResponseHeadersSchemaMap000Builder(instance); + } + } + + public static class Code200ResponseHeadersSchemaMap011Builder implements SetterForCode200ResponseInt32, SetterForCode200ResponseRefcontentschemaheader { + private final Map instance; + public Code200ResponseHeadersSchemaMap011Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public Code200ResponseHeadersSchemaMap001Builder getBuilderAfterCode200ResponseInt32(Map instance) { + return new Code200ResponseHeadersSchemaMap001Builder(instance); + } + public Code200ResponseHeadersSchemaMap010Builder getBuilderAfterCode200ResponseRefcontentschemaheader(Map instance) { + return new Code200ResponseHeadersSchemaMap010Builder(instance); + } + } + + public static class Code200ResponseHeadersSchemaMap100Builder implements SetterForCode200ResponseXRateLimit { + private final Map instance; + public Code200ResponseHeadersSchemaMap100Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public Code200ResponseHeadersSchemaMap000Builder getBuilderAfterCode200ResponseXRateLimit(Map instance) { + return new Code200ResponseHeadersSchemaMap000Builder(instance); + } + } + + public static class Code200ResponseHeadersSchemaMap101Builder implements SetterForCode200ResponseXRateLimit, SetterForCode200ResponseRefcontentschemaheader { + private final Map instance; + public Code200ResponseHeadersSchemaMap101Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public Code200ResponseHeadersSchemaMap001Builder getBuilderAfterCode200ResponseXRateLimit(Map instance) { + return new Code200ResponseHeadersSchemaMap001Builder(instance); + } + public Code200ResponseHeadersSchemaMap100Builder getBuilderAfterCode200ResponseRefcontentschemaheader(Map instance) { + return new Code200ResponseHeadersSchemaMap100Builder(instance); + } + } + + public static class Code200ResponseHeadersSchemaMap110Builder implements SetterForCode200ResponseXRateLimit, SetterForCode200ResponseInt32 { + private final Map instance; + public Code200ResponseHeadersSchemaMap110Builder(Map instance) { + this.instance = instance; + } + public Map getInstance() { + return instance; + } + public Code200ResponseHeadersSchemaMap010Builder getBuilderAfterCode200ResponseXRateLimit(Map instance) { + return new Code200ResponseHeadersSchemaMap010Builder(instance); + } + public Code200ResponseHeadersSchemaMap100Builder getBuilderAfterCode200ResponseInt32(Map instance) { + return new Code200ResponseHeadersSchemaMap100Builder(instance); + } + } + + public static class Code200ResponseHeadersSchemaMapBuilder implements SetterForCode200ResponseXRateLimit, SetterForCode200ResponseInt32, SetterForCode200ResponseRefcontentschemaheader { + private final Map instance; + public Code200ResponseHeadersSchemaMapBuilder() { + this.instance = new LinkedHashMap<>(); + } + public Map getInstance() { + return instance; + } + public Code200ResponseHeadersSchemaMap011Builder getBuilderAfterCode200ResponseXRateLimit(Map instance) { + return new Code200ResponseHeadersSchemaMap011Builder(instance); + } + public Code200ResponseHeadersSchemaMap101Builder getBuilderAfterCode200ResponseInt32(Map instance) { + return new Code200ResponseHeadersSchemaMap101Builder(instance); + } + public Code200ResponseHeadersSchemaMap110Builder getBuilderAfterCode200ResponseRefcontentschemaheader(Map instance) { + return new Code200ResponseHeadersSchemaMap110Builder(instance); + } + } + + + public sealed interface Code200ResponseHeadersSchema1Boxed permits Code200ResponseHeadersSchema1BoxedMap { + @Nullable Object getData(); + } + + public record Code200ResponseHeadersSchema1BoxedMap(Code200ResponseHeadersSchemaMap data) implements Code200ResponseHeadersSchema1Boxed { + @Override + public @Nullable Object getData() { + return data; + } + } + + + public static class Code200ResponseHeadersSchema1 extends JsonSchema implements MapSchemaValidator { + private static @Nullable Code200ResponseHeadersSchema1 instance = null; + + protected Code200ResponseHeadersSchema1() { + 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(Code200ResponseAdditionalProperties.class) + ); + } + + public static Code200ResponseHeadersSchema1 getInstance() { + if (instance == null) { + instance = new Code200ResponseHeadersSchema1(); + } + return instance; + } + + public Code200ResponseHeadersSchemaMap 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 Code200ResponseHeadersSchemaMap(castProperties); + } + + 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); + 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 Code200ResponseHeadersSchema1BoxedMap validateAndBox(Map arg, SchemaConfiguration configuration) throws ValidationException, InvalidTypeException { + return new Code200ResponseHeadersSchema1BoxedMap(validate(arg, configuration)); + } + @Override + public Code200ResponseHeadersSchema1Boxed 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..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 @@ -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()) + ), + Code200ResponseHeadersSchema.Code200ResponseHeadersSchema1.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/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..32207ae7232 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/paths/userlogin/get/responses/code200response/headers/NumberHeader.java @@ -0,0 +1,3 @@ +package org.openapijsonschematools.client.paths.userlogin.get.responses.code200response.headers; + +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/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/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/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.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/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/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/HeadersDeserializer.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java new file mode 100644 index 00000000000..bbd744abebc --- /dev/null +++ b/samples/client/petstore/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/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..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 @@ -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/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..30347681cbf --- /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", 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 new file mode 100644 index 00000000000..7b5795bcc14 --- /dev/null +++ b/samples/client/petstore/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/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/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/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/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java b/src/main/java/org/openapijsonschematools/codegen/generatorrunner/DefaultGeneratorRunner.java index bae4daee7d1..aec07ea86a0 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, headersInfo, generator.shouldGenerateFile(headersJsonPath)); for (Map.Entry headerInfo: response.headers.entrySet()) { String headerName = headerInfo.getKey(); CodegenHeader header = headerInfo.getValue(); @@ -658,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()) { @@ -983,7 +985,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 d6bb4c026c0..36892dbc45f 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() @@ -3070,17 +3071,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 +3091,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"; @@ -3111,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); @@ -3194,7 +3199,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,28 +3755,30 @@ protected void updateComponentsFilepath(String[] pathPieces) { return; } if (pathPieces[2].equals("headers")) { - pathPieces[3] = toHeaderFilename(pathPieces[3], null); - if (pathPieces.length >= 6 && pathPieces[4].equals("content")) { + // #/components/headers + pathPieces[3] = toHeaderFilename(pathPieces[3], jsonPath); + 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); @@ -3785,31 +3793,43 @@ 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("Headers")) { + if (pathPieces.length == 5 && pathPieces[4].equals(headersSchemaFragment)) { // synthetic json path // #/components/responses/someResponse/Headers pathPieces[4] = getSchemaFilename(jsonPath); return; } - if (pathPieces.length < 6) { - return; - } if (pathPieces[4].equals("headers")) { + 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], null); - if (pathPieces.length >= 8 && pathPieces[6].equals("content")) { + pathPieces[5] = toHeaderFilename(pathPieces[5], jsonPath); + 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); 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")) { - 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); @@ -3909,17 +3929,23 @@ 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 == 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 pathPieces[6] = getSchemaFilename(jsonPath); return; } - if (pathPieces.length < 8) { - return; - } 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); @@ -3927,8 +3953,13 @@ private void updatePathsFilepath(String[] pathPieces) { pathPieces[8] = getSchemaFilename(jsonPath); } } else if (pathPieces[6].equals("headers")) { + 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], 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 7c1a35ae9a5..b2db2b73472 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; @@ -284,7 +285,8 @@ public JavaClientGenerator() { DocumentationFeature.ComponentSchemas, DocumentationFeature.ComponentSecuritySchemes, DocumentationFeature.ComponentRequestBodies, - DocumentationFeature.ComponentResponses + DocumentationFeature.ComponentResponses, + DocumentationFeature.ComponentHeaders ) .includeGlobalFeatures( GlobalFeature.Components, @@ -295,7 +297,8 @@ public JavaClientGenerator() { ComponentsFeature.schemas, ComponentsFeature.securitySchemes, ComponentsFeature.requestBodies, - ComponentsFeature.responses + ComponentsFeature.responses, + ComponentsFeature.headers ) .includeSecurityFeatures( SecurityFeature.ApiKey, @@ -304,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, @@ -768,11 +775,67 @@ 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")); + 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", + packagePath() + File.separatorChar + "header", + "Header.java")); + 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/ContentHeader.hbs", + packagePath() + File.separatorChar + "header", + "ContentHeader.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")); + supportingFiles.add(new SupportingFile( + "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( "src/main/java/packagename/parameter/ParameterStyle.hbs", packagePath() + File.separatorChar + "parameter", "ParameterStyle.java")); + supportingFiles.add(new SupportingFile( + "src/main/java/packagename/parameter/ParameterInType.hbs", + packagePath() + File.separatorChar + "parameter", + "ParameterInType.java")); + // response supportingFiles.add(new SupportingFile( "src/main/java/packagename/response/ApiResponse.hbs", @@ -782,6 +845,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", @@ -809,6 +876,19 @@ 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"); + }} + ); + 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, @@ -828,6 +908,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<>(); @@ -906,7 +992,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); @@ -918,6 +1004,37 @@ 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 == 5) { + // #/components/responses/SomeResponse/headers + return "Headers"; + } else if (pathPieces.length == 6) { + // #/components/responses/SomeResponse/headers/SomeHeader + return toModelName(componentName, null); + } + // deeper paths + return toModuleFilename(componentName, jsonPath); + } + if (pathPieces.length == 7) { + // #/paths/somePath/verb/responses/200/headers + return "Headers"; + } else 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); @@ -1036,21 +1153,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<>()); @@ -1223,11 +1351,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), "."); } @@ -3044,6 +3171,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/PythonClientGenerator.java b/src/main/java/org/openapijsonschematools/codegen/generators/PythonClientGenerator.java index 7c887e08541..6d99be9685e 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) && componentName.equals("headers")) { + // #/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); 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 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/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/Header.hbs b/src/main/resources/java/src/main/java/packagename/components/headers/Header.hbs new file mode 100644 index 00000000000..a53f77ffce2 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/components/headers/Header.hbs @@ -0,0 +1,75 @@ +{{#with header}} +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}} +import {{packageName}}.header.SchemaHeader; + {{#with schema}} +import {{{packageName}}}.{{subpackage}}.{{containerJsonPathPiece.pascalCase}}; + {{/with}} + {{/if}} + {{#if content}} +import {{packageName}}.header.ContentHeader; +import {{packageName}}.mediatype.MediaType; + {{#each content}} + {{#with schema}} +import {{{packageName}}}.{{subpackage}}.{{containerJsonPathPiece.pascalCase}}; + {{/with}} + {{/each}} + +import java.util.AbstractMap; +import java.util.Map; + {{/if}} + +public class {{jsonPathPiece.pascalCase}} { + {{#each content}} + + public record {{@key.pascalCase}}MediaType({{#with this}}{{#with schema}}{{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}} schema{{/with}}{{/with}}) implements MediaType<{{#with this}}{{#with schema}}{{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}{{/with}}{{/with}}, Void> { + 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 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..f61189235ba --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/components/headers/HeaderDoc.hbs @@ -0,0 +1,97 @@ +{{#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 implements Header
+ +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}} + +{{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}} + +[[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/components/responses/HeadersDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/components/responses/HeadersDeserializer.hbs new file mode 100644 index 00000000000..00589fe3bee --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/components/responses/HeadersDeserializer.hbs @@ -0,0 +1,24 @@ +package {{packageName}}.{{headers.subpackage}}; + +import {{packageName}}.response.HeadersDeserializer; +{{#each headers}} +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}} + {{containerJsonPathPiece.pascalCase}}.{{jsonPathPiece.pascalCase}}.getInstance() +{{/with}} + ); + } +} \ No newline at end of file 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/components/responses/Responses.hbs b/src/main/resources/java/src/main/java/packagename/components/responses/Responses.hbs index 451981e9a22..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,6 +2,11 @@ package {{packageName}}.{{responses.subpackage}}; {{#each responses}} import {{{packageName}}}.{{subpackage}}.{{jsonPathPiece.pascalCase}}; + {{#with getSelfOrDeepestRef}} + {{#with headersObjectSchema}} +import {{{packageName}}}.{{subpackage}}.{{containerJsonPathPiece.pascalCase}}; + {{/with}} + {{/with}} {{/each}} import {{{packageName}}}.exceptions.ApiException; {{#if nonErrorResponses }} @@ -22,12 +27,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 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}} @@ -137,12 +139,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", 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/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..ced388d5803 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/header/ContentHeader.hbs @@ -0,0 +1,62 @@ +package {{{packageName}}}.header; + +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; + +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/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..30a90da0468 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/header/Header.hbs @@ -0,0 +1,12 @@ +package {{{packageName}}}.header; + +import org.checkerframework.checker.nullness.qual.Nullable; +import {{{packageName}}}.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/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..5cceec00321 --- /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/header/PrefixSeparatorIterator.hbs b/src/main/resources/java/src/main/java/packagename/header/PrefixSeparatorIterator.hbs new file mode 100644 index 00000000000..a1c542e9408 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/header/PrefixSeparatorIterator.hbs @@ -0,0 +1,27 @@ +package {{{packageName}}}.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/src/main/resources/java/src/main/java/packagename/header/Rfc6570Serializer.hbs b/src/main/resources/java/src/main/java/packagename/header/Rfc6570Serializer.hbs new file mode 100644 index 00000000000..f6e45696151 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/header/Rfc6570Serializer.hbs @@ -0,0 +1,186 @@ +package {{{packageName}}}.header; + +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.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/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..c3be42398e3 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/header/SchemaHeader.hbs @@ -0,0 +1,95 @@ +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 { + 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/src/main/resources/java/src/main/java/packagename/header/StyleSimpleSerializer.hbs b/src/main/resources/java/src/main/java/packagename/header/StyleSimpleSerializer.hbs new file mode 100644 index 00000000000..d4a1b2173fe --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/header/StyleSimpleSerializer.hbs @@ -0,0 +1,21 @@ +package {{{packageName}}}.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/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/parameter/ParameterInType.hbs b/src/main/resources/java/src/main/java/packagename/parameter/ParameterInType.hbs new file mode 100644 index 00000000000..3b4e45cbfb7 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/parameter/ParameterInType.hbs @@ -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/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/HeadersDeserializer.hbs b/src/main/resources/java/src/main/java/packagename/response/HeadersDeserializer.hbs new file mode 100644 index 00000000000..94094d69974 --- /dev/null +++ b/src/main/resources/java/src/main/java/packagename/response/HeadersDeserializer.hbs @@ -0,0 +1,35 @@ +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) { + // 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/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..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 @@ -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,17 @@ 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 { 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 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); } @@ -77,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/header/ContentHeaderTest.hbs b/src/main/resources/java/src/test/java/packagename/header/ContentHeaderTest.hbs new file mode 100644 index 00000000000..7bf8424a65a --- /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", false, configuration); + Assert.assertEquals(HttpHeaders.of(testCase.expectedSerialization, headerFilter), serialization); + } + } +} 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..b93c64802c1 --- /dev/null +++ b/src/main/resources/java/src/test/java/packagename/header/SchemaHeaderTest.hbs @@ -0,0 +1,161 @@ +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 {{{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; +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/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 { 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; } }