Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Java client, adds parameter classes #398

Merged
merged 12 commits into from
Mar 5, 2024
4 changes: 2 additions & 2 deletions docs/generators/java.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
| ---- | --------- | ---------- |
|schemas|✓|OAS3
|responses|✓|OAS3
|parameters||OAS3
|parameters||OAS3
|examples|✗|OAS3
|requestBodies|✓|OAS3
|headers|✓|OAS3
Expand Down Expand Up @@ -221,7 +221,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|Security|✗|OAS2,OAS3
|ComponentSchemas|✓|OAS3
|ComponentResponses|✓|OAS3
|ComponentParameters||OAS3
|ComponentParameters||OAS3
|ComponentRequestBodies|✓|OAS3
|ComponentHeaders|✓|OAS3
|ComponentSecuritySchemes|✓|OAS3
Expand Down
13 changes: 12 additions & 1 deletion samples/client/3_0_3_unit_test/java/.openapi-generator/FILES
Original file line number Diff line number Diff line change
Expand Up @@ -194,11 +194,20 @@ 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/header/StyleSerializer.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/ContentNonQueryParameter.java
src/main/java/org/openapijsonschematools/client/parameter/ContentParameter.java
src/main/java/org/openapijsonschematools/client/parameter/ContentQueryParameter.java
src/main/java/org/openapijsonschematools/client/parameter/NonQueryParameter.java
src/main/java/org/openapijsonschematools/client/parameter/ParameterBase.java
src/main/java/org/openapijsonschematools/client/parameter/ParameterInType.java
src/main/java/org/openapijsonschematools/client/parameter/ParameterStyle.java
src/main/java/org/openapijsonschematools/client/parameter/QueryParameter.java
src/main/java/org/openapijsonschematools/client/parameter/SchemaNonQueryParameter.java
src/main/java/org/openapijsonschematools/client/parameter/SchemaParameter.java
src/main/java/org/openapijsonschematools/client/parameter/SchemaQueryParameter.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
Expand Down Expand Up @@ -310,6 +319,8 @@ src/main/java/org/openapijsonschematools/client/servers/ServerWithoutVariables.j
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/parameter/SchemaNonQueryParameterTest.java
src/test/java/org/openapijsonschematools/client/parameter/SchemaQueryParameterTest.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
Expand Up @@ -33,7 +33,7 @@ private static HttpHeaders toHeaders(String name, String value) {
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);
var value = StyleSerializer.serializeSimple(castInData, name, usedExplode, false);
return toHeaders(name, value);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package org.openapijsonschematools.client.header;

import org.checkerframework.checker.nullness.qual.Nullable;

public class StyleSerializer 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
);
}

public static String serializeForm(
@Nullable Object inData,
String name,
boolean explode,
boolean percentEncode,
@Nullable PrefixSeparatorIterator iterator,
boolean isCookie
) {
// todo check that the prefix and suffix matches this one
String prefix = isCookie ? "" : "?";
PrefixSeparatorIterator usedIterator = iterator == null ? new PrefixSeparatorIterator(prefix, "&") : iterator;
return rfc6570Expansion(
name,
inData,
explode,
percentEncode,
usedIterator
);
}

public static String serializeMatrix(
@Nullable Object inData,
String name,
boolean explode
) {
PrefixSeparatorIterator usedIterator = new PrefixSeparatorIterator(";", ";");
return rfc6570Expansion(
name,
inData,
explode,
true,
usedIterator
);
}

public static String serializeLabel(
@Nullable Object inData,
String name,
boolean explode
) {
PrefixSeparatorIterator usedIterator = new PrefixSeparatorIterator(".", ".");
return rfc6570Expansion(
name,
inData,
explode,
true,
usedIterator
);
}

public static String serializeSpaceDelimited(
@Nullable Object inData,
String name,
boolean explode,
@Nullable PrefixSeparatorIterator iterator
) {
PrefixSeparatorIterator usedIterator = iterator == null ? new PrefixSeparatorIterator("", "%20") : iterator;
return rfc6570Expansion(
name,
inData,
explode,
true,
usedIterator
);
}

public static String serializePipeDelimited(
@Nullable Object inData,
String name,
boolean explode,
@Nullable PrefixSeparatorIterator iterator
) {
PrefixSeparatorIterator usedIterator = iterator == null ? new PrefixSeparatorIterator("", "|") : iterator;
return rfc6570Expansion(
name,
inData,
explode,
true,
usedIterator
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.openapijsonschematools.client.parameter;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.openapijsonschematools.client.configurations.SchemaConfiguration;
import org.openapijsonschematools.client.mediatype.MediaType;

import java.util.Map;

public class ContentNonQueryParameter extends ContentParameter implements NonQueryParameter {

public ContentNonQueryParameter(String name, ParameterInType inType, boolean required, @Nullable ParameterStyle style, @Nullable Boolean explode, @Nullable Boolean allowReserved, Map<String, MediaType<?, ?>> content) {
super(name, inType, required, style, explode, allowReserved, content);
}

@Override
public Map<String, String> serialize(@Nullable Object inData, boolean validate, SchemaConfiguration configuration) {
return super.serialize(inData, validate, configuration);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.openapijsonschematools.client.parameter;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.openapijsonschematools.client.configurations.SchemaConfiguration;
import org.openapijsonschematools.client.contenttype.ContentTypeDetector;
import org.openapijsonschematools.client.contenttype.ContentTypeSerializer;
import org.openapijsonschematools.client.mediatype.MediaType;

import java.util.Map;

public class ContentParameter extends ParameterBase {
public final Map<String, MediaType<?, ?>> content;

public ContentParameter(String name, ParameterInType inType, boolean required, @Nullable ParameterStyle style, @Nullable Boolean explode, @Nullable Boolean allowReserved, Map<String, MediaType<?, ?>> content) {
super(name, inType, required, style, explode, allowReserved);
this.content = content;
}

protected Map<String, String> serialize(@Nullable Object inData, 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 Map.of(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");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.openapijsonschematools.client.parameter;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.openapijsonschematools.client.configurations.SchemaConfiguration;
import org.openapijsonschematools.client.header.PrefixSeparatorIterator;
import org.openapijsonschematools.client.mediatype.MediaType;

import java.util.Map;

public class ContentQueryParameter extends ContentParameter implements QueryParameter {

public ContentQueryParameter(String name, ParameterInType inType, boolean required, @Nullable ParameterStyle style, @Nullable Boolean explode, @Nullable Boolean allowReserved, Map<String, MediaType<?, ?>> content) {
super(name, inType, required, style, explode, allowReserved, content);
}

@Override
public Map<String, String> serialize(@Nullable Object inData, boolean validate, SchemaConfiguration configuration, PrefixSeparatorIterator iterator) {
return super.serialize(inData, validate, configuration);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.openapijsonschematools.client.parameter;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.openapijsonschematools.client.configurations.SchemaConfiguration;

import java.util.Map;

public interface NonQueryParameter {
Map<String, String> serialize(@Nullable Object inData, boolean validate, SchemaConfiguration configuration);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.openapijsonschematools.client.parameter;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.openapijsonschematools.client.header.HeaderBase;
import org.openapijsonschematools.client.header.PrefixSeparatorIterator;

public class ParameterBase extends HeaderBase {
public final String name;
public final ParameterInType inType;

public ParameterBase(String name, ParameterInType inType, boolean required, @Nullable ParameterStyle style, @Nullable Boolean explode, @Nullable Boolean allowReserved) {
super(required, style, explode, allowReserved);
this.name = name;
this.inType = inType;
}

protected ParameterStyle getStyle() {
if (style != null) {
return style;
}
if (inType == ParameterInType.QUERY || inType == ParameterInType.COOKIE) {
return ParameterStyle.FORM;
}
// ParameterInType.HEADER || ParameterInType.PATH
return ParameterStyle.SIMPLE;
}

public PrefixSeparatorIterator getPrefixSeparatorIterator() {
ParameterStyle usedStyle = getStyle();
if (usedStyle == ParameterStyle.FORM) {
return new PrefixSeparatorIterator("?", "&");
} else if (usedStyle == ParameterStyle.SPACE_DELIMITED) {
return new PrefixSeparatorIterator("", "%20");
} else if (usedStyle == ParameterStyle.PIPE_DELIMITED) {
return new PrefixSeparatorIterator("", "|");
}
throw new RuntimeException("No iterator possible for style="+usedStyle);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.openapijsonschematools.client.parameter;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.openapijsonschematools.client.configurations.SchemaConfiguration;
import org.openapijsonschematools.client.header.PrefixSeparatorIterator;

import java.util.Map;

public interface QueryParameter {
Map<String, String> serialize(@Nullable Object inData, boolean validate, SchemaConfiguration configuration, PrefixSeparatorIterator iterator);
PrefixSeparatorIterator getPrefixSeparatorIterator();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.openapijsonschematools.client.parameter;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.openapijsonschematools.client.configurations.SchemaConfiguration;
import org.openapijsonschematools.client.header.PrefixSeparatorIterator;
import org.openapijsonschematools.client.schemas.validation.JsonSchema;

import java.util.Map;

public class SchemaNonQueryParameter extends SchemaParameter implements NonQueryParameter {

public SchemaNonQueryParameter(String name, ParameterInType inType, boolean required, @Nullable ParameterStyle style, @Nullable Boolean explode, @Nullable Boolean allowReserved, JsonSchema<?> schema) {
super(name, inType, required, style, explode, allowReserved, schema);
}

@Override
public Map<String, String> serialize(@Nullable Object inData, boolean validate, SchemaConfiguration configuration) {
return super.serialize(inData, validate, configuration, null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package org.openapijsonschematools.client.parameter;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.openapijsonschematools.client.configurations.SchemaConfiguration;
import org.openapijsonschematools.client.header.PrefixSeparatorIterator;
import org.openapijsonschematools.client.header.StyleSerializer;
import org.openapijsonschematools.client.schemas.validation.JsonSchema;
import org.openapijsonschematools.client.header.HeaderBase;
import org.openapijsonschematools.client.header.PrefixSeparatorIterator;
import org.openapijsonschematools.client.header.StyleSerializer;
import org.openapijsonschematools.client.schemas.validation.JsonSchema;
import java.util.Map;

public class SchemaParameter extends ParameterBase {
public final JsonSchema<?> schema;

public SchemaParameter(String name, ParameterInType inType, boolean required, @Nullable ParameterStyle style, @Nullable Boolean explode, @Nullable Boolean allowReserved, JsonSchema<?> schema) {
super(name, inType, required, style, explode, allowReserved);
this.schema = schema;
}

protected Map<String, String> serialize(@Nullable Object inData, boolean validate, SchemaConfiguration configuration, @Nullable PrefixSeparatorIterator iterator) {
var castInData = validate ? schema.validate(inData, configuration) : inData;
ParameterStyle usedStyle = getStyle();
boolean percentEncode = inType == ParameterInType.QUERY || inType == ParameterInType.PATH;
String value;
boolean usedExplode = explode == null ? usedStyle == ParameterStyle.FORM : explode;
if (usedStyle == ParameterStyle.SIMPLE) {
// header OR path
value = StyleSerializer.serializeSimple(castInData, name, usedExplode, percentEncode);
} else if (usedStyle == ParameterStyle.FORM) {
// query OR cookie
boolean isCookie = inType == ParameterInType.COOKIE;
value = StyleSerializer.serializeForm(castInData, name, usedExplode, percentEncode, iterator, isCookie);
} else if (usedStyle == ParameterStyle.LABEL) {
// path
value = StyleSerializer.serializeLabel(castInData, name, usedExplode);
} else if (usedStyle == ParameterStyle.MATRIX) {
// path
value = StyleSerializer.serializeMatrix(castInData, name, usedExplode);
} else if (usedStyle == ParameterStyle.SPACE_DELIMITED) {
// query
value = StyleSerializer.serializeSpaceDelimited(castInData, name, usedExplode, iterator);
} else if (usedStyle == ParameterStyle.PIPE_DELIMITED) {
// query
value = StyleSerializer.serializePipeDelimited(castInData, name, usedExplode, iterator);
} else {
// usedStyle == ParameterStyle.DEEP_OBJECT
// query
throw new RuntimeException("Style deep object serialization has not yet been implemented.");
}
return Map.of(name, value);
}
}
Loading