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

Commit b7b04f7

Browse files
authored
Java client, adds header (#396)
* Adds ParameterSerializerBase * Adds classes that header class needs * Removes 2 unneeded classes * Adds Header interface * Adds header serialization test * Adds content type detector and serializer, adds ContentHeader * Adds ContentHeader and test * Generates headers for responses * Fixes headers schema import locations * Fixes case where imported schema class was overwritten * Adds missing header imports * Adds header docs * Adds header deserialization for individual headers only * Adds header deserialization to header docs, deserialization test added * Adds missing test helper * Adds HeadersDeserializer class * Generates headers deserializer files * Fixes package name for headers * Fixes case where imported header collided with the class name * Fixes test warnings * Integrates heeaders deserializer in the response deserializer * Updates HeaderSchema to not collide when they are imprted into responses * Fixes Headers class names * Improves conditionals used in file path generation * Adds responses header schema import * Integrates headers in sealed responses * Fixes header integration in responses when response is refed * Samples and docs regen * Samples updated * Sample regen to fix python header path issues * Python petstore regen * Python regen with header schema fix
1 parent 77adb1e commit b7b04f7

File tree

268 files changed

+6145
-2044
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

268 files changed

+6145
-2044
lines changed

docs/generators/java.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
182182
|parameters|✗|OAS3
183183
|examples|✗|OAS3
184184
|requestBodies|✓|OAS3
185-
|headers||OAS3
185+
|headers||OAS3
186186
|securitySchemes|✓|OAS3
187187
|links|✗|OAS3
188188
|callbacks|✗|OAS3
@@ -223,7 +223,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
223223
|ComponentResponses|✓|OAS3
224224
|ComponentParameters|✗|OAS3
225225
|ComponentRequestBodies|✓|OAS3
226-
|ComponentHeaders||OAS3
226+
|ComponentHeaders||OAS3
227227
|ComponentSecuritySchemes|✓|OAS3
228228
|ComponentLinks|✗|OAS3
229229
|ComponentCallbacks|✗|OAS3
@@ -245,10 +245,10 @@ These options may be applied as additional-properties (cli) or configOptions (pl
245245
### Operation Feature
246246
| Name | Supported | Defined By |
247247
| ---- | --------- | ---------- |
248-
|Responses_HttpStatusCode||OAS3
249-
|Responses_RangedResponseCodes||OAS3
250-
|Responses_Default||OAS3
251-
|Responses_RedirectionResponse||OAS3
248+
|Responses_HttpStatusCode||OAS3
249+
|Responses_RangedResponseCodes||OAS3
250+
|Responses_Default||OAS3
251+
|Responses_RedirectionResponse||OAS3
252252
|Security|✓|OAS2,OAS3
253253
|Servers|✓|OAS3
254254

samples/client/3_0_3_unit_test/java/.openapi-generator/FILES

+14
Original file line numberDiff line numberDiff line change
@@ -179,20 +179,32 @@ src/main/java/org/openapijsonschematools/client/components/schemas/UriTemplateFo
179179
src/main/java/org/openapijsonschematools/client/configurations/ApiConfiguration.java
180180
src/main/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlags.java
181181
src/main/java/org/openapijsonschematools/client/configurations/SchemaConfiguration.java
182+
src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDeserializer.java
183+
src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeDetector.java
184+
src/main/java/org/openapijsonschematools/client/contenttype/ContentTypeSerializer.java
182185
src/main/java/org/openapijsonschematools/client/exceptions/ApiException.java
183186
src/main/java/org/openapijsonschematools/client/exceptions/BaseException.java
184187
src/main/java/org/openapijsonschematools/client/exceptions/InvalidAdditionalPropertyException.java
185188
src/main/java/org/openapijsonschematools/client/exceptions/InvalidTypeException.java
186189
src/main/java/org/openapijsonschematools/client/exceptions/UnsetPropertyException.java
187190
src/main/java/org/openapijsonschematools/client/exceptions/ValidationException.java
191+
src/main/java/org/openapijsonschematools/client/header/ContentHeader.java
192+
src/main/java/org/openapijsonschematools/client/header/Header.java
193+
src/main/java/org/openapijsonschematools/client/header/HeaderBase.java
194+
src/main/java/org/openapijsonschematools/client/header/PrefixSeparatorIterator.java
195+
src/main/java/org/openapijsonschematools/client/header/Rfc6570Serializer.java
196+
src/main/java/org/openapijsonschematools/client/header/SchemaHeader.java
197+
src/main/java/org/openapijsonschematools/client/header/StyleSimpleSerializer.java
188198
src/main/java/org/openapijsonschematools/client/mediatype/Encoding.java
189199
src/main/java/org/openapijsonschematools/client/mediatype/MediaType.java
200+
src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java
190201
src/main/java/org/openapijsonschematools/client/parameter/ParameterStyle.java
191202
src/main/java/org/openapijsonschematools/client/requestbody/GenericRequestBody.java
192203
src/main/java/org/openapijsonschematools/client/requestbody/RequestBodySerializer.java
193204
src/main/java/org/openapijsonschematools/client/requestbody/SerializedRequestBody.java
194205
src/main/java/org/openapijsonschematools/client/response/ApiResponse.java
195206
src/main/java/org/openapijsonschematools/client/response/DeserializedHttpResponse.java
207+
src/main/java/org/openapijsonschematools/client/response/HeadersDeserializer.java
196208
src/main/java/org/openapijsonschematools/client/response/ResponseDeserializer.java
197209
src/main/java/org/openapijsonschematools/client/response/ResponsesDeserializer.java
198210
src/main/java/org/openapijsonschematools/client/schemas/AnyTypeJsonSchema.java
@@ -296,6 +308,8 @@ src/main/java/org/openapijsonschematools/client/servers/ServerProvider.java
296308
src/main/java/org/openapijsonschematools/client/servers/ServerWithVariables.java
297309
src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.java
298310
src/test/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlagsTest.java
311+
src/test/java/org/openapijsonschematools/client/header/ContentHeaderTest.java
312+
src/test/java/org/openapijsonschematools/client/header/SchemaHeaderTest.java
299313
src/test/java/org/openapijsonschematools/client/requestbody/RequestBodySerializerTest.java
300314
src/test/java/org/openapijsonschematools/client/response/ResponseDeserializerTest.java
301315
src/test/java/org/openapijsonschematools/client/schemas/AnyTypeSchemaTest.java
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.openapijsonschematools.client.contenttype;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
5+
import com.google.gson.ToNumberPolicy;
6+
import org.checkerframework.checker.nullness.qual.Nullable;
7+
8+
public class ContentTypeDeserializer {
9+
private static final Gson gson = new GsonBuilder()
10+
.setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
11+
.setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
12+
.create();
13+
14+
@SuppressWarnings("nullness")
15+
public static @Nullable Object fromJson(String json) {
16+
return gson.fromJson(json, Object.class);
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.openapijsonschematools.client.contenttype;
2+
3+
import java.util.regex.Pattern;
4+
5+
public class ContentTypeDetector {
6+
private static final Pattern jsonContentTypePattern = Pattern.compile(
7+
"application/[^+]*[+]?(json);?.*"
8+
);
9+
private static final String textPlainContentType = "text/plain";
10+
11+
public static boolean contentTypeIsJson(String contentType) {
12+
return jsonContentTypePattern.matcher(contentType).find();
13+
}
14+
15+
public static boolean contentTypeIsTextPlain(String contentType) {
16+
return textPlainContentType.equals(contentType);
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.openapijsonschematools.client.contenttype;
2+
3+
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
5+
import com.google.gson.ToNumberPolicy;
6+
import org.checkerframework.checker.nullness.qual.Nullable;
7+
8+
public class ContentTypeSerializer {
9+
private static final Gson gson = new GsonBuilder()
10+
.setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
11+
.setNumberToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
12+
.create();
13+
14+
@SuppressWarnings("nullness")
15+
public static String toJson(@Nullable Object body) {
16+
return gson.toJson(body);
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package org.openapijsonschematools.client.header;
2+
3+
import org.checkerframework.checker.nullness.qual.Nullable;
4+
import org.openapijsonschematools.client.configurations.SchemaConfiguration;
5+
import org.openapijsonschematools.client.contenttype.ContentTypeDetector;
6+
import org.openapijsonschematools.client.contenttype.ContentTypeSerializer;
7+
import org.openapijsonschematools.client.contenttype.ContentTypeDeserializer;
8+
import org.openapijsonschematools.client.mediatype.MediaType;
9+
import org.openapijsonschematools.client.parameter.ParameterStyle;
10+
11+
import java.net.http.HttpHeaders;
12+
import java.util.List;
13+
import java.util.Map;
14+
import java.util.function.BiPredicate;
15+
16+
public class ContentHeader extends HeaderBase implements Header {
17+
public final Map<String, MediaType<?, ?>> content;
18+
19+
public ContentHeader(boolean required, @Nullable Boolean allowReserved, @Nullable Boolean explode, Map<String, MediaType<?, ?>> content) {
20+
super(required, ParameterStyle.SIMPLE, explode, allowReserved);
21+
this.content = content;
22+
}
23+
24+
private static HttpHeaders toHeaders(String name, String value) {
25+
Map<String, List<String>> map = Map.of(name, List.of(value));
26+
BiPredicate<String, String> headerFilter = (key, val) -> true;
27+
return HttpHeaders.of(map, headerFilter);
28+
}
29+
30+
@Override
31+
public HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration) {
32+
for (Map.Entry<String, MediaType<?, ?>> entry: content.entrySet()) {
33+
var castInData = validate ? entry.getValue().schema().validate(inData, configuration) : inData ;
34+
String contentType = entry.getKey();
35+
if (ContentTypeDetector.contentTypeIsJson(contentType)) {
36+
var value = ContentTypeSerializer.toJson(castInData);
37+
return toHeaders(name, value);
38+
} else {
39+
throw new RuntimeException("Serialization of "+contentType+" has not yet been implemented");
40+
}
41+
}
42+
throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair");
43+
}
44+
45+
@Override
46+
public @Nullable Object deserialize(List<String> inData, boolean validate, SchemaConfiguration configuration) {
47+
String inDataJoined = String.join(",", inData); // unsure if this is needed
48+
@Nullable Object deserializedJson = ContentTypeDeserializer.fromJson(inDataJoined);
49+
if (validate) {
50+
for (Map.Entry<String, MediaType<?, ?>> entry: content.entrySet()) {
51+
String contentType = entry.getKey();
52+
if (ContentTypeDetector.contentTypeIsJson(contentType)) {
53+
return entry.getValue().schema().validate(deserializedJson, configuration);
54+
} else {
55+
throw new RuntimeException("Header deserialization of "+contentType+" has not yet been implemented");
56+
}
57+
}
58+
throw new RuntimeException("Invalid value for content, it was empty and must have 1 key value pair");
59+
}
60+
return deserializedJson;
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.openapijsonschematools.client.header;
2+
3+
import org.checkerframework.checker.nullness.qual.Nullable;
4+
import org.openapijsonschematools.client.configurations.SchemaConfiguration;
5+
6+
import java.net.http.HttpHeaders;
7+
import java.util.List;
8+
9+
public interface Header {
10+
HttpHeaders serialize(@Nullable Object inData, String name, boolean validate, SchemaConfiguration configuration);
11+
@Nullable Object deserialize(List<String> inData, boolean validate, SchemaConfiguration configuration);
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.openapijsonschematools.client.header;
2+
3+
import org.checkerframework.checker.nullness.qual.Nullable;
4+
import org.openapijsonschematools.client.parameter.ParameterStyle;
5+
6+
public class HeaderBase {
7+
public final boolean required;
8+
public final @Nullable ParameterStyle style;
9+
public final @Nullable Boolean explode;
10+
public final @Nullable Boolean allowReserved;
11+
12+
public HeaderBase(boolean required, @Nullable ParameterStyle style, @Nullable Boolean explode, @Nullable Boolean allowReserved) {
13+
this.required = required;
14+
this.style = style;
15+
this.explode = explode;
16+
this.allowReserved = allowReserved;
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.openapijsonschematools.client.header;
2+
3+
import java.util.Set;
4+
5+
public class PrefixSeparatorIterator {
6+
// A class to store prefixes and separators for rfc6570 expansions
7+
public final String prefix;
8+
public final String separator;
9+
private boolean first;
10+
public final String itemSeparator;
11+
private static final Set<String> reusedSeparators = Set.of(".", "|", "%20");
12+
13+
public PrefixSeparatorIterator(String prefix, String separator) {
14+
this.prefix = prefix;
15+
this.separator = separator;
16+
itemSeparator = reusedSeparators.contains(separator) ? separator : ",";
17+
first = true;
18+
}
19+
20+
public String next() {
21+
if (first) {
22+
first = false;
23+
return prefix;
24+
}
25+
return separator;
26+
}
27+
}

0 commit comments

Comments
 (0)