Skip to content

Commit

Permalink
Java client, adds parameter classes (#398)
Browse files Browse the repository at this point in the history
* Adds parameter base classes

* Generates parameter classes

* Fixes java parameter filenames, fixes java errors

* Fixes in + style value for parameters

* Adds 4 separate base classes for parameters

* Fixes mvn test run

* Fixes build and test errors

* Adds parameter tests

* Adds parameter docs

* Fixes readme links to parameter docs

* Docs regen

* Samples regen
  • Loading branch information
spacether committed Mar 5, 2024
1 parent 6f5ca75 commit 1563295
Show file tree
Hide file tree
Showing 151 changed files with 5,951 additions and 62 deletions.
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

0 comments on commit 1563295

Please sign in to comment.