Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.

Java client, adds header #396

Merged
merged 32 commits into from
Mar 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
60fab67
Adds ParameterSerializerBase
spacether Feb 27, 2024
84cfd98
Adds classes that header class needs
spacether Feb 28, 2024
9682980
Removes 2 unneeded classes
spacether Feb 28, 2024
d078835
Adds Header interface
spacether Feb 28, 2024
34e79e5
Adds header serialization test
spacether Feb 28, 2024
38bfcf3
Adds content type detector and serializer, adds ContentHeader
spacether Feb 28, 2024
187303c
Adds ContentHeader and test
spacether Feb 28, 2024
8365bb4
Generates headers for responses
spacether Feb 28, 2024
1e9c6b0
Fixes headers schema import locations
spacether Feb 28, 2024
f2fb2d2
Fixes case where imported schema class was overwritten
spacether Feb 29, 2024
62fc39a
Adds missing header imports
spacether Feb 29, 2024
fbb3b29
Adds header docs
spacether Feb 29, 2024
6496a40
Adds header deserialization for individual headers only
spacether Feb 29, 2024
8b7aec0
Adds header deserialization to header docs, deserialization test added
spacether Feb 29, 2024
89929af
Adds missing test helper
spacether Feb 29, 2024
ac2b076
Adds HeadersDeserializer class
spacether Feb 29, 2024
b5ed046
Generates headers deserializer files
spacether Feb 29, 2024
e008bf0
Fixes package name for headers
spacether Mar 1, 2024
e0699b6
Fixes case where imported header collided with the class name
spacether Mar 1, 2024
5c86928
Fixes test warnings
spacether Mar 1, 2024
a8f7688
Integrates heeaders deserializer in the response deserializer
spacether Mar 1, 2024
8b77ccb
Updates HeaderSchema to not collide when they are imprted into responses
spacether Mar 1, 2024
5b62635
Fixes Headers class names
spacether Mar 1, 2024
fdfbab4
Improves conditionals used in file path generation
spacether Mar 1, 2024
3de1c4c
Adds responses header schema import
spacether Mar 1, 2024
5d735e1
Integrates headers in sealed responses
spacether Mar 1, 2024
d39ee9f
Fixes header integration in responses when response is refed
spacether Mar 1, 2024
c61a103
Samples and docs regen
spacether Mar 1, 2024
5308c9b
Samples updated
spacether Mar 1, 2024
52ff64d
Sample regen to fix python header path issues
spacether Mar 1, 2024
d4a6d40
Python petstore regen
spacether Mar 1, 2024
144515f
Python regen with header schema fix
spacether Mar 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions docs/generators/java.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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

Expand Down
14 changes: 14 additions & 0 deletions samples/client/3_0_3_unit_test/java/.openapi-generator/FILES
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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<String, MediaType<?, ?>> content;

public ContentHeader(boolean required, @Nullable Boolean allowReserved, @Nullable Boolean explode, Map<String, MediaType<?, ?>> content) {
super(required, ParameterStyle.SIMPLE, explode, allowReserved);
this.content = content;
}

private static HttpHeaders toHeaders(String name, String value) {
Map<String, List<String>> map = Map.of(name, List.of(value));
BiPredicate<String, String> 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<String, MediaType<?, ?>> 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<String> 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<String, MediaType<?, ?>> 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;
}
}
Original file line number Diff line number Diff line change
@@ -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<String> inData, boolean validate, SchemaConfiguration configuration);
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<String> 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;
}
}
Loading