iterator = list.iterator();
+ StringBuilder out = new StringBuilder();
+ if (iterator.hasNext()) {
+ out.append(iterator.next());
+ }
+ while (iterator.hasNext()) {
+ out.append(separator).append(iterator.next());
+ }
+ return out.toString();
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/additionalEnumTypeAnnotations.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/additionalEnumTypeAnnotations.mustache
new file mode 100644
index 00000000000..aa524798b42
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/additionalEnumTypeAnnotations.mustache
@@ -0,0 +1,2 @@
+{{#additionalEnumTypeAnnotations}}{{{.}}}
+{{/additionalEnumTypeAnnotations}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/additionalModelTypeAnnotations.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/additionalModelTypeAnnotations.mustache
new file mode 100644
index 00000000000..f4871c02cc2
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/additionalModelTypeAnnotations.mustache
@@ -0,0 +1,2 @@
+{{#additionalModelTypeAnnotations}}{{{.}}}
+{{/additionalModelTypeAnnotations}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api.mustache
new file mode 100644
index 00000000000..6367b03ed23
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api.mustache
@@ -0,0 +1,61 @@
+{{>licenseInfo}}
+package {{package}};
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import {{rootJavaEEPackage}}.ws.rs.*;
+import {{rootJavaEEPackage}}.ws.rs.core.Response;
+import {{rootJavaEEPackage}}.ws.rs.core.MediaType;
+
+import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+
+{{#imports}}import {{import}};
+{{/imports}}
+
+{{#appName}}
+/**
+ * {{{appName}}}
+ *
+ {{#appDescription}}
+ * {{{.}}}
+ {{/appDescription}}
+ */
+{{/appName}}
+@RegisterRestClient{{#configKey}}(configKey="{{configKey}}"){{/configKey}}
+@RegisterProvider(ApiExceptionMapper.class)
+@Path("{{#useAnnotatedBasePath}}{{contextPath}}{{/useAnnotatedBasePath}}{{commonPath}}")
+public interface {{classname}} {
+{{#operations}}
+{{#operation}}
+
+ {{#summary}}
+ /**
+ * {{summary}}
+ {{#notes}}
+ * {{.}}
+ {{/notes}}
+ {{#isDeprecated}}
+ * @deprecated
+ {{/isDeprecated}}
+ */
+ {{/summary}}
+ {{#isDeprecated}}
+ @Deprecated
+ {{/isDeprecated}}
+ @{{httpMethod}}
+ {{#subresourceOperation}}@Path("{{{path}}}"){{/subresourceOperation}}
+{{#hasConsumes}}
+ @Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} })
+{{/hasConsumes}}
+{{#hasProduces}}
+ @Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} })
+{{/hasProduces}}
+ {{{returnType}}}{{^returnType}}void{{/returnType}} {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>cookieParams}}{{>bodyParams}}{{>formParams}}{{^-last}}, {{/-last}}{{/allParams}}) throws ApiException, ProcessingException;
+{{/operation}}
+}
+{{/operations}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/apiOperation.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/apiOperation.mustache
new file mode 100644
index 00000000000..97adb0ea285
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/apiOperation.mustache
@@ -0,0 +1,28 @@
+{{>licenseInfo}}
+package {{invokerPackage}};
+
+import io.swagger.v3.oas.models.Operation;
+
+public class ApiOperation {
+ private final String path;
+ private final String method;
+ private final Operation operation;
+
+ public ApiOperation(String path, String method, Operation operation) {
+ this.path = path;
+ this.method = method;
+ this.operation = operation;
+ }
+
+ public Operation getOperation() {
+ return operation;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public String getMethod() {
+ return method;
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_doc.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_doc.mustache
new file mode 100644
index 00000000000..ba9757d1edb
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_doc.mustache
@@ -0,0 +1,55 @@
+# {{classname}}{{#description}}
+
+{{.}}{{/description}}
+
+All URIs are relative to *{{basePath}}*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+{{#operations}}{{#operation}}| [**{{operationId}}**]({{classname}}.md#{{operationId}}) | **{{httpMethod}}** {{commonPath}}{{path}} | {{summary}} |
+{{/operation}}{{/operations}}
+
+{{#operations}}
+{{#operation}}
+
+## {{operationId}}
+
+> {{#returnType}}{{.}} {{/returnType}}{{operationId}}({{#allParams}}{{{paramName}}}{{^-last}}, {{/-last}}{{/allParams}})
+
+{{summary}}{{#notes}}
+
+{{.}}{{/notes}}
+
+### Parameters
+
+{{^allParams}}This endpoint does not need any parameter.{{/allParams}}{{#allParams}}{{#-last}}
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|{{/-last}}{{/allParams}}
+{{#allParams}}| **{{paramName}}** | {{#isPrimitiveType}}**{{dataType}}**{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isFile}}**{{dataType}}**{{/isFile}}{{^isFile}}[**{{dataType}}**]({{baseType}}.md){{/isFile}}{{/isPrimitiveType}}| {{description}} |{{^required}} [optional]{{/required}}{{^isContainer}}{{#defaultValue}} [default to {{.}}]{{/defaultValue}}{{/isContainer}}{{#allowableValues}} [enum: {{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}]{{/allowableValues}} |
+{{/allParams}}
+
+### Return type
+
+{{#returnType}}{{#returnTypeIsPrimitive}}**{{returnType}}**{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}}[**{{returnType}}**]({{returnBaseType}}.md){{/returnTypeIsPrimitive}}{{/returnType}}{{^returnType}}null (empty response body){{/returnType}}
+
+### Authorization
+
+{{^authMethods}}No authorization required{{/authMethods}}{{#authMethods}}[{{name}}](../README.md#{{name}}){{^-last}}, {{/-last}}{{/authMethods}}
+
+### HTTP request headers
+
+- **Content-Type**: {{#consumes}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/consumes}}{{^consumes}}Not defined{{/consumes}}
+- **Accept**: {{#produces}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/produces}}{{^produces}}Not defined{{/produces}}
+
+{{#responses.0}}
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+{{#responses}}
+| **{{code}}** | {{message}} | {{#headers}} * {{baseName}} - {{description}}
{{/headers}}{{^headers.0}} - {{/headers.0}} |
+{{/responses}}
+{{/responses.0}}
+
+{{/operation}}
+{{/operations}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_exception.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_exception.mustache
new file mode 100644
index 00000000000..d9fb5ee91d8
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_exception.mustache
@@ -0,0 +1,19 @@
+{{>licenseInfo}}
+package {{apiPackage}};
+
+import {{rootJavaEEPackage}}.ws.rs.core.Response;
+
+public class ApiException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ private final Response response;
+
+ public ApiException(Response response) {
+ super("Api response has status code " + response.getStatus());
+ this.response = response;
+ }
+
+ public Response getResponse() {
+ return this.response;
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_exception_mapper.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_exception_mapper.mustache
new file mode 100644
index 00000000000..ac4db62e8b8
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_exception_mapper.mustache
@@ -0,0 +1,22 @@
+{{>licenseInfo}}
+package {{apiPackage}};
+
+import {{rootJavaEEPackage}}.ws.rs.core.MultivaluedMap;
+import {{rootJavaEEPackage}}.ws.rs.core.Response;
+import {{rootJavaEEPackage}}.ws.rs.ext.Provider;
+
+import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper;
+
+@Provider
+public class ApiExceptionMapper implements ResponseExceptionMapper {
+
+ @Override
+ public boolean handles(int status, MultivaluedMap headers) {
+ return status >= 400;
+ }
+
+ @Override
+ public ApiException toThrowable(Response response) {
+ return new ApiException(response);
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_test.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_test.mustache
new file mode 100644
index 00000000000..cbe676a88ba
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/api_test.mustache
@@ -0,0 +1,64 @@
+{{>licenseInfo}}
+
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import org.eclipse.microprofile.rest.client.RestClientBuilder;
+
+import java.net.URL;
+import java.net.MalformedURLException;
+{{^fullJavaUtil}}
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+{{/fullJavaUtil}}
+
+/**
+ {{#appName}}
+ * {{{.}}} Test
+ *
+ {{/appName}}
+ * API tests for {{classname}}
+ */
+public class {{classname}}Test {
+
+ private static {{classname}} client;
+ private static final String baseUrl = "http://localhost:8080";
+
+ @BeforeAll
+ public static void setup() throws MalformedURLException {
+ client = RestClientBuilder.newBuilder()
+ .baseUrl(new URL(baseUrl))
+ .register(ApiException.class)
+ .build({{classname}}.class);
+ }
+
+ {{#operations}}{{#operation}}
+ /**
+ {{#summary}}
+ * {{summary}}
+ *
+ {{#notes}}
+ * {{.}}
+ *
+ {{/notes}}
+ {{/summary}}
+ * @throws ApiException
+ * if the Api call fails
+ */
+ @Test
+ public void {{operationId}}Test() throws Exception {
+ {{#allParams}}
+ {{/allParams}}
+ //{{#returnType}}{{{.}}} response = {{/returnType}}client.{{operationId}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
+ //{{#returnType}}assertNotNull(response);{{/returnType}}
+ }
+ {{/operation}}{{/operations}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/auth/ApiKeyAuth.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/auth/ApiKeyAuth.mustache
new file mode 100644
index 00000000000..991ae235003
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/auth/ApiKeyAuth.mustache
@@ -0,0 +1,66 @@
+{{>licenseInfo}}
+
+package {{invokerPackage}}.auth;
+
+import {{invokerPackage}}.Pair;
+
+import java.util.Map;
+import java.util.List;
+
+{{>generatedAnnotation}}
+public class ApiKeyAuth implements Authentication {
+ private final String location;
+ private final String paramName;
+
+ private String apiKey;
+ private String apiKeyPrefix;
+
+ public ApiKeyAuth(String location, String paramName) {
+ this.location = location;
+ this.paramName = paramName;
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
+ public String getParamName() {
+ return paramName;
+ }
+
+ public String getApiKey() {
+ return apiKey;
+ }
+
+ public void setApiKey(String apiKey) {
+ this.apiKey = apiKey;
+ }
+
+ public String getApiKeyPrefix() {
+ return apiKeyPrefix;
+ }
+
+ public void setApiKeyPrefix(String apiKeyPrefix) {
+ this.apiKeyPrefix = apiKeyPrefix;
+ }
+
+ @Override
+ public void applyToParams(List queryParams, Map headerParams, Map cookieParams) {
+ if (apiKey == null) {
+ return;
+ }
+ String value;
+ if (apiKeyPrefix != null) {
+ value = apiKeyPrefix + " " + apiKey;
+ } else {
+ value = apiKey;
+ }
+ if ("query".equals(location)) {
+ queryParams.add(new Pair(paramName, value));
+ } else if ("header".equals(location)) {
+ headerParams.put(paramName, value);
+ } else if ("cookie".equals(location)) {
+ cookieParams.put(paramName, value);
+ }
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/auth/HttpBasicAuth.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/auth/HttpBasicAuth.mustache
new file mode 100644
index 00000000000..b5c72de6e7e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/auth/HttpBasicAuth.mustache
@@ -0,0 +1,42 @@
+{{>licenseInfo}}
+
+package {{invokerPackage}}.auth;
+
+import {{invokerPackage}}.Pair;
+
+import java.util.Base64;
+import java.nio.charset.StandardCharsets;
+
+import java.util.Map;
+import java.util.List;
+
+{{>generatedAnnotation}}
+public class HttpBasicAuth implements Authentication {
+ private String username;
+ private String password;
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ @Override
+ public void applyToParams(List queryParams, Map headerParams, Map cookieParams) {
+ if (username == null && password == null) {
+ return;
+ }
+ String str = (username == null ? "" : username) + ":" + (password == null ? "" : password);
+ headerParams.put("Authorization", "Basic " + Base64.getEncoder().encodeToString(str.getBytes(StandardCharsets.UTF_8)));
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/auth/HttpBearerAuth.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/auth/HttpBearerAuth.mustache
new file mode 100644
index 00000000000..322281f8716
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/auth/HttpBearerAuth.mustache
@@ -0,0 +1,49 @@
+{{>licenseInfo}}
+
+package {{invokerPackage}}.auth;
+
+import {{invokerPackage}}.Pair;
+
+import java.util.Map;
+import java.util.List;
+
+{{>generatedAnnotation}}
+public class HttpBearerAuth implements Authentication {
+ private final String scheme;
+ private String bearerToken;
+
+ public HttpBearerAuth(String scheme) {
+ this.scheme = scheme;
+ }
+
+ /**
+ * Gets the token, which together with the scheme, will be sent as the value of the Authorization header.
+ *
+ * @return The bearer token
+ */
+ public String getBearerToken() {
+ return bearerToken;
+ }
+
+ /**
+ * Sets the token, which together with the scheme, will be sent as the value of the Authorization header.
+ *
+ * @param bearerToken The bearer token to send in the Authorization header
+ */
+ public void setBearerToken(String bearerToken) {
+ this.bearerToken = bearerToken;
+ }
+
+ @Override
+ public void applyToParams(List queryParams, Map headerParams, Map cookieParams) {
+ if(bearerToken == null) {
+ return;
+ }
+
+ headerParams.put("Authorization", (scheme != null ? upperCaseBearer(scheme) + " " : "") + bearerToken);
+ }
+
+ private static String upperCaseBearer(String scheme) {
+ return ("bearer".equalsIgnoreCase(scheme)) ? "Bearer" : scheme;
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/bodyParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/bodyParams.mustache
new file mode 100644
index 00000000000..c7d1abfe527
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/bodyParams.mustache
@@ -0,0 +1 @@
+{{#isBodyParam}}{{{dataType}}} {{paramName}}{{/isBodyParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/cookieParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/cookieParams.mustache
new file mode 100644
index 00000000000..fea14348d7f
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/cookieParams.mustache
@@ -0,0 +1 @@
+{{#isCookieParam}}@CookieParam("{{baseName}}"){{^isContainer}}{{#defaultValue}} @DefaultValue("{{{.}}}"){{/defaultValue}}{{/isContainer}} {{#useSwaggerAnnotations}}{{#description}} @ApiParam("{{.}}"){{/description}}{{/useSwaggerAnnotations}} {{{dataType}}} {{paramName}}{{/isCookieParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/enumClass.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/enumClass.mustache
new file mode 100644
index 00000000000..d32efebf489
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/enumClass.mustache
@@ -0,0 +1,46 @@
+{{#jsonb}}
+ @JsonbTypeSerializer({{datatypeWithEnum}}.Serializer.class)
+ @JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class)
+{{/jsonb}}
+{{>additionalEnumTypeAnnotations}}public enum {{datatypeWithEnum}} {
+
+ {{#allowableValues}}
+ {{#enumVars}}{{name}}({{dataType}}.valueOf({{{value}}})){{^-last}}, {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}
+ {{/allowableValues}}
+
+ {{dataType}} value;
+
+ {{datatypeWithEnum}} ({{dataType}} v) {
+ value = v;
+ }
+
+ public {{dataType}} value() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ {{#jsonb}}
+ public static final class Deserializer implements JsonbDeserializer<{{datatypeWithEnum}}> {
+ @Override
+ public {{datatypeWithEnum}} deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (String.valueOf(b.value).equals(parser.getString())) {
+ return b;
+ }
+ }
+ {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + parser.getString() + "'");{{/useNullForUnknownEnumValue}}
+ }
+ }
+
+ public static final class Serializer implements JsonbSerializer<{{datatypeWithEnum}}> {
+ @Override
+ public void serialize({{datatypeWithEnum}} obj, JsonGenerator generator, SerializationContext ctx) {
+ generator.write(obj.value);
+ }
+ }
+ {{/jsonb}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/enumOuterClass.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/enumOuterClass.mustache
new file mode 100644
index 00000000000..39417c635f8
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/enumOuterClass.mustache
@@ -0,0 +1,39 @@
+{{#jackson}}
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+{{/jackson}}
+
+/**
+ * {{description}}{{^description}}Gets or Sets {{{name}}}{{/description}}
+ */
+{{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} {
+ {{#allowableValues}}{{#enumVars}}
+ {{{name}}}({{{value}}}){{^-last}},
+ {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}}
+
+ private {{{dataType}}} value;
+
+ {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}({{{dataType}}} value) {
+ this.value = value;
+ }
+
+ @Override
+{{#jackson}}
+ @JsonValue
+{{/jackson}}
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+{{#jackson}}
+ @JsonCreator
+{{/jackson}}
+ public static {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue(String text) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (String.valueOf(b.value).equals(text)) {
+ return b;
+ }
+ }
+ {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + text + "'");{{/useNullForUnknownEnumValue}}
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/enum_outer_doc.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/enum_outer_doc.mustache
new file mode 100644
index 00000000000..20c512aaeae
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/enum_outer_doc.mustache
@@ -0,0 +1,7 @@
+# {{classname}}
+
+## Enum
+
+{{#allowableValues}}{{#enumVars}}
+* `{{name}}` (value: `{{{value}}}`)
+{{/enumVars}}{{/allowableValues}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/formParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/formParams.mustache
new file mode 100644
index 00000000000..fa85e0c8947
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/formParams.mustache
@@ -0,0 +1 @@
+{{#isFormParam}}@FormParam("{{baseName}}") {{{dataType}}} {{paramName}}{{/isFormParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/generatedAnnotation.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/generatedAnnotation.mustache
new file mode 100644
index 00000000000..356a48872aa
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/generatedAnnotation.mustache
@@ -0,0 +1 @@
+@{{rootJavaEEPackage}}.annotation.Generated(value = "{{generatorClass}}"{{^hideGenerationTimestamp}}, date = "{{generatedDate}}"{{/hideGenerationTimestamp}})
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/headerParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/headerParams.mustache
new file mode 100644
index 00000000000..25d690c90ed
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/headerParams.mustache
@@ -0,0 +1 @@
+{{#isHeaderParam}}@HeaderParam("{{baseName}}") {{{dataType}}} {{paramName}}{{/isHeaderParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/jackson_annotations.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/jackson_annotations.mustache
new file mode 100644
index 00000000000..ccde126f54e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/jackson_annotations.mustache
@@ -0,0 +1,19 @@
+{{!
+ If this is map and items are nullable, make sure that nulls are included.
+ To determine what JsonInclude.Include method to use, consider the following:
+ * If the field is required, always include it, even if it is null.
+ * Else use custom behaviour, IOW use whatever is defined on the object mapper
+ }}
+ @JsonProperty(JSON_PROPERTY_{{nameInSnakeCase}})
+ @JsonInclude({{#isMap}}{{#items.isNullable}}content = JsonInclude.Include.ALWAYS, {{/items.isNullable}}{{/isMap}}value = JsonInclude.Include.{{#required}}ALWAYS{{/required}}{{^required}}USE_DEFAULTS{{/required}})
+ {{#withXml}}
+ {{^isContainer}}
+ @JacksonXmlProperty({{#isXmlAttribute}}isAttribute = true, {{/isXmlAttribute}}{{#xmlNamespace}}namespace="{{.}}", {{/xmlNamespace}}localName = "{{xmlName}}{{^xmlName}}{{baseName}}{{/xmlName}}")
+ {{/isContainer}}
+ {{#isContainer}}
+ {{#isXmlWrapped}}
+ // items.xmlName={{items.xmlName}}
+ @JacksonXmlElementWrapper(useWrapping = {{isXmlWrapped}}, {{#xmlNamespace}}namespace="{{.}}", {{/xmlNamespace}}localName = "{{#items.xmlName}}{{items.xmlName}}{{/items.xmlName}}{{^items.xmlName}}{{items.baseName}}{{/items.xmlName}}")
+ {{/isXmlWrapped}}
+ {{/isContainer}}
+ {{/withXml}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/licenseInfo.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/licenseInfo.mustache
new file mode 100644
index 00000000000..be193d0c4fe
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/licenseInfo.mustache
@@ -0,0 +1,11 @@
+/**
+ * {{{appName}}}
+ * {{{appDescription}}}
+ *
+ * {{#version}}The version of the OpenAPI document: {{{.}}}{{/version}}
+ * {{#infoEmail}}Contact: {{{.}}}{{/infoEmail}}
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/model.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/model.mustache
new file mode 100644
index 00000000000..ad4e98b8a45
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/model.mustache
@@ -0,0 +1,19 @@
+{{>licenseInfo}}
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+{{#serializableModel}}
+import java.io.Serializable;
+{{/serializableModel}}
+
+{{#models}}
+{{#model}}
+{{#isEnum}}
+{{>enumOuterClass}}
+{{/isEnum}}
+{{^isEnum}}
+{{>pojo}}
+{{/isEnum}}
+{{/model}}
+{{/models}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/modelInnerEnum.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/modelInnerEnum.mustache
new file mode 100644
index 00000000000..a9c99783fd0
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/modelInnerEnum.mustache
@@ -0,0 +1,95 @@
+ /**
+ * {{description}}{{^description}}Gets or Sets {{{name}}}{{/description}}
+ */
+{{#gson}}
+ @JsonAdapter({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}.Adapter.class)
+{{/gson}}
+{{#jsonb}}
+ @JsonbTypeSerializer({{datatypeWithEnum}}.Serializer.class)
+ @JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class)
+{{/jsonb}}
+{{#withXml}}
+ @XmlType(name="{{datatypeWithEnum}}")
+ @XmlEnum({{dataType}}.class)
+{{/withXml}}
+ {{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} {
+ {{#allowableValues}}
+ {{#enumVars}}
+ {{#enumDescription}}
+ /**
+ * {{.}}
+ */
+ {{/enumDescription}}
+ {{#withXml}}
+ @XmlEnumValue({{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}}{{{value}}}{{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}})
+ {{/withXml}}
+ {{{name}}}({{{value}}}){{^-last}},
+ {{/-last}}{{#-last}};{{/-last}}
+ {{/enumVars}}
+ {{/allowableValues}}
+
+ private {{{dataType}}} value;
+
+ {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}({{{dataType}}} value) {
+ this.value = value;
+ }
+
+{{#jackson}}
+ @JsonValue
+{{/jackson}}
+ public {{{dataType}}} getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+{{#jackson}}
+ @JsonCreator
+{{/jackson}}
+ public static {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue({{{dataType}}} value) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ {{#isNullable}}return null;{{/isNullable}}{{^isNullable}}throw new IllegalArgumentException("Unexpected value '" + value + "'");{{/isNullable}}
+ }
+{{#gson}}
+
+ public static class Adapter extends TypeAdapter<{{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}> {
+ @Override
+ public void write(final JsonWriter jsonWriter, final {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} enumeration) throws IOException {
+ jsonWriter.value(enumeration.getValue());
+ }
+
+ @Override
+ public {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} read(final JsonReader jsonReader) throws IOException {
+ {{^isNumber}}{{{dataType}}}{{/isNumber}}{{#isNumber}}String{{/isNumber}} value = {{#isFloat}}(float){{/isFloat}} jsonReader.{{#isNumber}}nextString(){{/isNumber}}{{#isInteger}}nextInt(){{/isInteger}}{{^isNumber}}{{^isInteger}}{{#isFloat}}nextDouble{{/isFloat}}{{^isFloat}}next{{{dataType}}}{{/isFloat}}(){{/isInteger}}{{/isNumber}};
+ return {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}.fromValue({{#isNumber}}new BigDecimal({{/isNumber}}value{{#isNumber}}){{/isNumber}});
+ }
+ }
+{{/gson}}
+{{#jsonb}}
+ public static final class Deserializer implements JsonbDeserializer<{{datatypeWithEnum}}> {
+ @Override
+ public {{datatypeWithEnum}} deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (String.valueOf(b.value).equals(parser.getString())) {
+ return b;
+ }
+ }
+ {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + parser.getString() + "'");{{/useNullForUnknownEnumValue}}
+ }
+ }
+
+ public static final class Serializer implements JsonbSerializer<{{datatypeWithEnum}}> {
+ @Override
+ public void serialize({{datatypeWithEnum}} obj, JsonGenerator generator, SerializationContext ctx) {
+ generator.write(obj.value);
+ }
+ }
+{{/jsonb}}
+ }
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/model_doc.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/model_doc.mustache
new file mode 100644
index 00000000000..9a7fe146a4e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/model_doc.mustache
@@ -0,0 +1,4 @@
+{{#models}}{{#model}}
+
+{{#isEnum}}{{>enum_outer_doc}}{{/isEnum}}{{^isEnum}}{{>pojo_doc}}{{/isEnum}}
+{{/model}}{{/models}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/model_test.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/model_test.mustache
new file mode 100644
index 00000000000..92c1e7ee2e3
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/model_test.mustache
@@ -0,0 +1,49 @@
+{{>licenseInfo}}
+
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+
+import org.junit.jupiter.api.Test;
+
+{{#fullJavaUtil}}
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+{{/fullJavaUtil}}
+
+/**
+ * Model tests for {{classname}}
+ */
+public class {{classname}}Test {
+ {{#models}}
+ {{#model}}
+ {{^vendorExtensions.x-is-one-of-interface}}
+ {{^isEnum}}
+ private final {{classname}} model = new {{classname}}();
+
+ {{/isEnum}}
+ /**
+ * Model tests for {{classname}}
+ */
+ @Test
+ public void test{{classname}}() {
+ // TODO: test {{classname}}
+ }
+
+ {{#allVars}}
+ /**
+ * Test the property '{{name}}'
+ */
+ @Test
+ public void {{name}}Test() {
+ // TODO: test {{name}}
+ }
+
+ {{/allVars}}
+ {{/vendorExtensions.x-is-one-of-interface}}
+ {{/model}}
+ {{/models}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/oneof_interface.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/oneof_interface.mustache
new file mode 100644
index 00000000000..02deb483d5f
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/oneof_interface.mustache
@@ -0,0 +1,6 @@
+{{>additionalModelTypeAnnotations}}{{>generatedAnnotation}}{{>typeInfoAnnotation}}{{>xmlAnnotation}}
+public interface {{classname}} {{#vendorExtensions.x-implements}}{{#-first}}extends {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
+ {{#discriminator}}
+ public {{propertyType}} {{propertyGetter}}();
+ {{/discriminator}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/openapi.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/openapi.mustache
new file mode 100644
index 00000000000..34fbb53f331
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/openapi.mustache
@@ -0,0 +1 @@
+{{{openapi-yaml}}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pathParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pathParams.mustache
new file mode 100644
index 00000000000..ba153467a65
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pathParams.mustache
@@ -0,0 +1 @@
+{{#isPathParam}}@PathParam("{{baseName}}") {{{dataType}}} {{paramName}}{{/isPathParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pojo.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pojo.mustache
new file mode 100644
index 00000000000..84115fa7d02
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pojo.mustache
@@ -0,0 +1,155 @@
+
+{{#jsonb}}
+import java.lang.reflect.Type;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeDeserializer;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.DeserializationContext;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbDeserializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.SerializationContext;
+import {{rootJavaEEPackage}}.json.stream.JsonGenerator;
+import {{rootJavaEEPackage}}.json.stream.JsonParser;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbProperty;
+{{#vendorExtensions.x-has-readonly-properties}}
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbCreator;
+{{/vendorExtensions.x-has-readonly-properties}}
+{{/jsonb}}
+
+{{#description}}
+/**
+ * {{{.}}}
+ **/
+{{/description}}
+{{>additionalModelTypeAnnotations}}
+{{#vendorExtensions.x-class-extra-annotation}}
+{{{vendorExtensions.x-class-extra-annotation}}}
+{{/vendorExtensions.x-class-extra-annotation}}
+public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
+ {{#vars}}{{#isEnum}}{{^isContainer}}
+{{>enumClass}}{{/isContainer}}{{#isContainer}}{{#mostInnerItems}}
+{{>enumClass}}{{/mostInnerItems}}{{/isContainer}}{{/isEnum}}
+{{#description}}
+ /**
+ * {{{.}}}
+ **/
+{{/description}}
+{{#vendorExtensions.x-field-extra-annotation}}
+{{{vendorExtensions.x-field-extra-annotation}}}
+{{/vendorExtensions.x-field-extra-annotation}}
+{{#isContainer}}
+ private {{{datatypeWithEnum}}} {{name}}{{#required}} = {{{defaultValue}}}{{/required}}{{^required}} = null{{/required}};
+{{/isContainer}}
+{{^isContainer}}
+ private {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};
+{{/isContainer}}
+ {{/vars}}
+{{#vendorExtensions.x-has-readonly-properties}}{{#jsonb}}
+ public {{classname}}() {
+ }
+
+ @JsonbCreator
+ public {{classname}}(
+ {{#readOnlyVars}}
+ @JsonbProperty("{{baseName}}") {{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}
+ {{/readOnlyVars}}
+ ) {
+ {{#readOnlyVars}}
+ this.{{name}} = {{name}};
+ {{/readOnlyVars}}
+ }
+ {{/jsonb}}{{/vendorExtensions.x-has-readonly-properties}}
+ {{#vars}}
+ /**
+ {{#description}}
+ * {{.}}
+ {{/description}}
+ {{^description}}
+ * Get {{name}}
+ {{/description}}
+ {{#minimum}}
+ * minimum: {{.}}
+ {{/minimum}}
+ {{#maximum}}
+ * maximum: {{.}}
+ {{/maximum}}
+ * @return {{name}}
+ {{#deprecated}}
+ * @deprecated
+ {{/deprecated}}
+ **/
+{{#deprecated}}
+ @Deprecated
+{{/deprecated}}
+{{#vendorExtensions.x-extra-annotation}}
+ {{{vendorExtensions.x-extra-annotation}}}
+{{/vendorExtensions.x-extra-annotation}}
+ {{#withXml}}{{#isEnum}}{{^isArray}}{{^isMap}}public {{dataType}} {{getter}}() {
+ if ({{name}} == null) {
+ return null;
+ }
+ return {{name}}.value();
+ }{{/isMap}}{{/isArray}}{{/isEnum}}{{/withXml}}{{^withXml}}{{#isEnum}}{{^isArray}}{{^isMap}}public {{datatypeWithEnum}} {{getter}}() {
+ return {{name}};
+ }{{/isMap}}{{/isArray}}{{/isEnum}}{{/withXml}}{{#isEnum}}{{#isArray}}public {{{datatypeWithEnum}}} {{getter}}() {
+ return {{name}};
+ }{{/isArray}}{{/isEnum}}{{#isEnum}}{{#isMap}}public {{{datatypeWithEnum}}} {{getter}}() {
+ return {{name}};
+ }{{/isMap}}{{/isEnum}}{{^isEnum}}public {{{datatypeWithEnum}}} {{getter}}() {
+ return {{name}};
+ }{{/isEnum}}
+
+ {{^isReadOnly}}
+ /**
+ * Set {{name}}
+ **/
+ {{#vendorExtensions.x-setter-extra-annotation}} {{{vendorExtensions.x-setter-extra-annotation}}}
+ {{/vendorExtensions.x-setter-extra-annotation}}public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {
+ this.{{name}} = {{name}};
+ }
+
+ public {{classname}} {{name}}({{{datatypeWithEnum}}} {{name}}) {
+ this.{{name}} = {{name}};
+ return this;
+ }
+ {{#isArray}}
+
+ public {{classname}} add{{nameInCamelCase}}Item({{{items.datatypeWithEnum}}} {{name}}Item) {
+ this.{{name}}.add({{name}}Item);
+ return this;
+ }
+ {{/isArray}}
+ {{#isMap}}
+
+ public {{classname}} put{{nameInCamelCase}}Item(String key, {{{items.datatypeWithEnum}}} {{name}}Item) {
+ this.{{name}}.put(key, {{name}}Item);
+ return this;
+ }
+ {{/isMap}}
+ {{/isReadOnly}}
+
+ {{/vars}}
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class {{classname}} {\n");
+ {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}}
+ {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n");
+ {{/vars}}sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pojo_doc.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pojo_doc.mustache
new file mode 100644
index 00000000000..bae0bc48cdd
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pojo_doc.mustache
@@ -0,0 +1,37 @@
+# {{#vendorExtensions.x-is-one-of-interface}}Interface {{/vendorExtensions.x-is-one-of-interface}}{{classname}}
+
+{{#description}}{{&description}}
+{{/description}}
+{{^vendorExtensions.x-is-one-of-interface}}
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+{{#vars}}|**{{name}}** | {{#isEnum}}[**{{datatypeWithEnum}}**](#{{datatypeWithEnum}}){{/isEnum}}{{^isEnum}}{{#isContainer}}{{#isArray}}{{#items}}{{#isModel}}[{{/isModel}}{{/items}}**{{baseType}}{{#items}}<{{dataType}}>**{{#isModel}}]({{^baseType}}{{dataType}}{{/baseType}}{{baseType}}.md){{/isModel}}{{/items}}{{/isArray}}{{#isMap}}{{#items}}{{#isModel}}[{{/isModel}}**Map<String, {{dataType}}>**{{#isModel}}]({{^baseType}}{{dataType}}{{/baseType}}{{baseType}}.md){{/isModel}}{{/items}}{{/isMap}}{{/isContainer}}{{^isContainer}}{{#isModel}}[{{/isModel}}**{{dataType}}**{{#isModel}}]({{^baseType}}{{dataType}}{{/baseType}}{{baseType}}.md){{/isModel}}{{/isContainer}}{{/isEnum}} | {{description}} | {{^required}} [optional]{{/required}}{{#isReadOnly}} [readonly]{{/isReadOnly}} |
+{{/vars}}
+{{#vars}}{{#isEnum}}
+
+
+## Enum: {{datatypeWithEnum}}
+
+| Name | Value |
+|---- | -----|{{#allowableValues}}{{#enumVars}}
+| {{name}} | {{value}} |{{/enumVars}}{{/allowableValues}}
+{{/isEnum}}{{/vars}}
+{{#vendorExtensions.x-implements.0}}
+
+## Implemented Interfaces
+
+{{#vendorExtensions.x-implements}}
+* {{{.}}}
+{{/vendorExtensions.x-implements}}
+{{/vendorExtensions.x-implements.0}}
+{{/vendorExtensions.x-is-one-of-interface}}
+{{#vendorExtensions.x-is-one-of-interface}}
+## Implementing Classes
+
+{{#oneOf}}
+* {{{.}}}
+{{/oneOf}}
+{{/vendorExtensions.x-is-one-of-interface}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pom.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pom.mustache
new file mode 100644
index 00000000000..6deab37c810
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/pom.mustache
@@ -0,0 +1,90 @@
+
+ 4.0.0
+ {{groupId}}
+
+ io.helidon.applications
+ helidon-mp
+ {{helidonVersion}}
+
+
+ {{artifactId}}
+ {{artifactId}}
+ {{artifactVersion}}
+ {{artifactUrl}}
+ {{artifactDescription}}
+ jar
+
+
+
+ io.helidon.microprofile.rest-client
+ helidon-microprofile-rest-client
+
+
+ io.helidon.microprofile.config
+ helidon-microprofile-config
+
+
+ org.glassfish.jersey.ext.cdi
+ jersey-cdi1x
+
+
+ {{x-helidon-rootJavaEEDepPrefix}}.enterprise
+ {{x-helidon-rootJavaEEDepPrefix}}.enterprise.cdi-api
+
+
+ {{x-helidon-rootJavaEEDepPrefix}}.json
+ {{x-helidon-rootJavaEEDepPrefix}}.json-api
+
+{{#jackson}}
+
+ org.glassfish.jersey.media
+ jersey-media-json-jackson
+
+
+ org.openapitools
+ jackson-databind-nullable
+ 0.2.2
+
+{{/jackson}}
+{{#jsonb}}
+
+ org.glassfish.jersey.media
+ jersey-media-json-binding
+
+
+ {{x-helidon-rootJavaEEDepPrefix}}.json.bind
+ {{x-helidon-rootJavaEEDepPrefix}}.json.bind-api
+
+{{/jsonb}}
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-libs
+
+
+
+
+ org.jboss.jandex
+ jandex-maven-plugin
+
+
+ make-index
+
+
+
+
+
+
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/queryParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/queryParams.mustache
new file mode 100644
index 00000000000..4b1a980896f
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/queryParams.mustache
@@ -0,0 +1 @@
+{{#isQueryParam}}@QueryParam("{{baseName}}") {{^isContainer}}{{#defaultValue}}@DefaultValue("{{{.}}}") {{/defaultValue}}{{/isContainer}}{{{dataType}}} {{paramName}}{{/isQueryParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/returnTypes.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/returnTypes.mustache
new file mode 100644
index 00000000000..32f96a90472
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/returnTypes.mustache
@@ -0,0 +1,4 @@
+{{#useGenericResponse}}Response{{/useGenericResponse}}{{! non-generic response:
+}}{{^useGenericResponse}}{{!
+}}{{{returnType}}}{{!
+}}{{/useGenericResponse}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/typeInfoAnnotation.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/typeInfoAnnotation.mustache
new file mode 100644
index 00000000000..c833321ebfa
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/mp/typeInfoAnnotation.mustache
@@ -0,0 +1,17 @@
+{{#jackson}}
+
+@JsonIgnoreProperties(
+ value = "{{{discriminator.propertyBaseName}}}", // ignore manually set {{{discriminator.propertyBaseName}}}, it will be automatically generated by Jackson during serialization
+ allowSetters = true // allows the {{{discriminator.propertyBaseName}}} to be set during deserialization
+)
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true)
+{{#discriminator.mappedModels}}
+{{#-first}}
+@JsonSubTypes({
+{{/-first}}
+ @JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
+{{#-last}}
+})
+{{/-last}}
+{{/discriminator.mappedModels}}
+{{/jackson}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ApiClient.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ApiClient.mustache
new file mode 100644
index 00000000000..1ca0223fb45
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ApiClient.mustache
@@ -0,0 +1,276 @@
+{{>licenseInfo}}
+package {{invokerPackage}};
+
+{{#jsonb}}import {{rootJavaEEPackage}}.json.bind.JsonbBuilder;
+import {{rootJavaEEPackage}}.json.bind.JsonbConfig;
+{{/jsonb}}
+{{#jackson}}import com.fasterxml.jackson.databind.ObjectMapper;
+{{/jackson}}
+{{#openApiNullable}}
+{{#jackson}}
+import org.openapitools.jackson.nullable.JsonNullableModule;
+{{/jackson}}
+{{/openApiNullable}}
+
+import io.helidon.config.Config;
+{{#jsonb}}
+import io.helidon.media.jsonb.JsonbSupport;
+{{/jsonb}}
+{{#jackson}}
+import io.helidon.media.jackson.JacksonSupport;
+{{/jackson}}
+import io.helidon.webclient.WebClient;
+
+import java.net.URI;
+import java.net.URLEncoder;
+import java.time.Duration;
+{{#java8}}
+import java.time.OffsetDateTime;
+import java.time.format.DateTimeFormatter;
+{{/java8}}
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+{{#jsonb}}
+import java.util.Map;
+{{/jsonb}}
+import java.util.StringJoiner;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+/**
+ * Configuration and utility class for API clients.
+ *
+ * Use the {@link ApiClient.Builder} class to prepare and ultimately create the {@code ApiClient} instance.
+ *
+ */
+public class ApiClient {
+
+ private final WebClient webClient;
+
+ /**
+ * @return a {@code Builder} for an {@code ApiClient}
+ */
+ public static ApiClient.Builder builder() {
+ return new Builder();
+ }
+
+ /**
+ * URL encode a string in the UTF-8 encoding.
+ *
+ * @param s String to encode.
+ * @return URL-encoded representation of the input string.
+ */
+ public static String urlEncode(String s) {
+ return URLEncoder.encode(s, UTF_8);
+ }
+
+ /**
+ * Convert a URL query name/value parameter to a list of encoded {@link Pair}
+ * objects.
+ *
+ * The value can be null, in which case an empty list is returned.
+ *
+ * @param name The query name parameter.
+ * @param value The query value, which may not be a collection but may be
+ * null.
+ * @return A singleton list of the {@link Pair} objects representing the input
+ * parameters, which is encoded for use in a URL. If the value is null, an
+ * empty list is returned.
+ */
+ public static List parameterToPairs(String name, Object value) {
+ if (name == null || name.isEmpty() || value == null) {
+ return Collections.emptyList();
+ }
+ return Collections.singletonList(new Pair(urlEncode(name), urlEncode(valueToString(value))));
+ }
+
+ /**
+ * Convert a URL query name/collection parameter to a list of encoded
+ * {@link Pair} objects.
+ *
+ * @param collectionFormat The swagger collectionFormat string (csv, tsv, etc).
+ * @param name The query name parameter.
+ * @param values A collection of values for the given query name, which may be
+ * null.
+ * @return A list of {@link Pair} objects representing the input parameters,
+ * which is encoded for use in a URL. If the values collection is null, an
+ * empty list is returned.
+ */
+ public static List parameterToPairs(
+ String collectionFormat, String name, Collection> values) {
+ if (name == null || name.isEmpty() || values == null || values.isEmpty()) {
+ return Collections.emptyList();
+ }
+
+ // get the collection format (default: csv)
+ String format = collectionFormat == null || collectionFormat.isEmpty() ? "csv" : collectionFormat;
+
+ // create the params based on the collection format
+ if ("multi".equals(format)) {
+ return values.stream()
+ .map(value -> new Pair(urlEncode(name), urlEncode(valueToString(value))))
+ .collect(Collectors.toList());
+ }
+
+ String delimiter;
+ switch(format) {
+ case "csv":
+ delimiter = urlEncode(",");
+ break;
+ case "ssv":
+ delimiter = urlEncode(" ");
+ break;
+ case "tsv":
+ delimiter = urlEncode("\t");
+ break;
+ case "pipes":
+ delimiter = urlEncode("|");
+ break;
+ default:
+ throw new IllegalArgumentException("Illegal collection format: " + collectionFormat);
+ }
+
+ StringJoiner joiner = new StringJoiner(delimiter);
+ for (Object value : values) {
+ joiner.add(urlEncode(valueToString(value)));
+ }
+
+ return Collections.singletonList(new Pair(urlEncode(name), joiner.toString()));
+ }
+
+ private ApiClient(Builder builder) {
+ webClient = builder.webClientBuilder().build();
+ }
+
+ /**
+ * Get the {@link WebClient} prepared by the builder of this {@code ApiClient}.
+ *
+ * @return the WebClient
+ */
+ public WebClient webClient() {
+ return webClient;
+ }
+
+ private static String valueToString(Object value) {
+ if (value == null) {
+ return "";
+ }
+ {{#java8}}
+ if (value instanceof OffsetDateTime) {
+ return ((OffsetDateTime) value).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+ }
+ {{/java8}}
+ return value.toString();
+ }
+
+ /**
+ * Builder for creating a new {@code ApiClient} instance.
+ *
+ *
+ * The builder accepts a {@link WebClient.Builder} via the {@code webClientBuilder} method but will provide a default one
+ * using available configuration (the {@code client} node) and the base URI set in the OpenAPI document.
+ *
+ */
+ public static class Builder {
+
+ private WebClient.Builder webClientBuilder;
+ private Config clientConfig;
+ {{#jsonb}}
+ private JsonbConfig jsonbConfig;
+ {{/jsonb}}
+ {{#jackson}}
+ private ObjectMapper objectMapper;
+ {{/jackson}}
+
+ public ApiClient build() {
+ return new ApiClient(this);
+ }
+
+ /**
+ * Sets the {@code WebClient.Builder} which the {@code ApiClient.Builder} uses. Any previous setting is discarded.
+ *
+ * @param webClientBuilder the {@code WebClient.Builder} to be used going forward
+ * @return the updated builder
+ */
+ public Builder webClientBuilder(WebClient.Builder webClientBuilder) {
+ this.webClientBuilder = webClientBuilder;
+ return this;
+ }
+
+ /**
+ * Sets the client {@code Config} which the {@code ApiClient.Builder} uses in preparing a default {@code WebClient.Builder}.
+ * The builder ignores this setting if you provide your own {@code WebClient.Builder} by invoking the
+ * {@code webClientBuilder} method.
+ *
+ * @param clientConfig the {@code Config} node containing client settings
+ * @return the updated builder
+ */
+ public Builder clientConfig(Config clientConfig) {
+ this.clientConfig = clientConfig;
+ return this;
+ }
+
+ /**
+ * @return the previously-stored web client builder or, if none, a default one using the provided or defaulted
+ * client configuration
+ */
+ public WebClient.Builder webClientBuilder() {
+ if (webClientBuilder == null) {
+ webClientBuilder = defaultWebClientBuilder();
+ }
+ return webClientBuilder;
+ }
+
+ {{#jsonb}}
+ /**
+ * Stores the JSON-B configuration the builder uses in preparing the {@code WebClient}.
+ *
+ * @param jsonbConfig the JSON-B config to use in all API invocations via the built {@code ApiClient}
+ * @return the updated builder
+ */
+ public Builder jsonbConfig(JsonbConfig jsonbConfig) {
+ this.jsonbConfig = jsonbConfig;
+ return this;
+ }
+ {{/jsonb}}
+ {{#jackson}}
+ /**
+ * Stores the Jackson {@code ObjectMapper} the builder uses in preparing the {@code WebClient}.
+ *
+ * @param objectMapper the Jackson object mapper to use in all API invocations via the built {@code ApiClient}
+ * @return the updated builder
+ */
+ public Builder objectMapper(ObjectMapper objectMapper) {
+ this.objectMapper = objectMapper;
+ return this;
+ }
+ {{/jackson}}
+
+ private WebClient.Builder defaultWebClientBuilder() {
+ WebClient.Builder defaultWebClientBuilder = WebClient.builder()
+ .baseUri("{{basePath}}")
+ .config(clientConfig());
+ {{#jsonb}}
+ defaultWebClientBuilder.addMediaSupport(jsonbConfig == null
+ ? JsonbSupport.create()
+ : JsonbSupport.create(jsonbConfig));
+ {{/jsonb}}
+ {{#jackson}}
+ defaultWebClientBuilder.addMediaSupport(objectMapper == null
+ ? JacksonSupport.create()
+ : JacksonSupport.create(objectMapper));
+ {{/jackson}}
+ return defaultWebClientBuilder;
+ }
+
+ private Config clientConfig() {
+ if (clientConfig == null) {
+ clientConfig = Config.create().get("client");
+ }
+ return clientConfig;
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ApiResponse.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ApiResponse.mustache
new file mode 100644
index 00000000000..b651e0b4f25
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ApiResponse.mustache
@@ -0,0 +1,34 @@
+{{>licenseInfo}}
+package {{invokerPackage}};
+
+import java.util.concurrent.ExecutionException;
+
+import io.helidon.common.GenericType;
+import io.helidon.common.reactive.Single;
+import io.helidon.webclient.WebClientResponse;
+
+{{#appName}}
+/**
+ * Generic-typed response.
+ *
+ * Return type for generated API methods.
+ *
+ * @param type of the return value from the generated API method
+ */
+{{/appName}}
+public interface ApiResponse {
+
+ static ApiResponse create(GenericType responseType, Single webClientResponse) {
+ return new ApiResponseBase<>(responseType, webClientResponse);
+ }
+
+ /**
+ * @returns reactive access to the {@link WebClientResponse} describing the response from the server
+ */
+ Single webClientResponse();
+
+ /**
+ * @return reactive access to the value returned in the response from the server
+ */
+ Single result() throws ExecutionException, InterruptedException;
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ApiResponseBase.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ApiResponseBase.mustache
new file mode 100644
index 00000000000..31228f0dc3b
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ApiResponseBase.mustache
@@ -0,0 +1,36 @@
+{{>licenseInfo}}
+package {{invokerPackage}};
+
+import java.util.concurrent.ExecutionException;
+
+import io.helidon.common.GenericType;
+import io.helidon.common.reactive.Single;
+import io.helidon.webclient.WebClientResponse;
+
+{{#appName}}
+/**
+ * Implementation of a generic-typed response.
+ *
+ * @param type of the return value from the generated API method
+ */
+{{/appName}}
+class ApiResponseBase implements ApiResponse {
+
+ private final Single webClientResponse;
+ private final GenericType responseType;
+
+ protected ApiResponseBase(GenericType responseType, Single webClientResponse) {
+ this.webClientResponse = webClientResponse;
+ this.responseType = responseType;
+ }
+
+ @Override
+ public Single webClientResponse() {
+ return webClientResponse;
+ }
+
+ @Override
+ public Single result() throws ExecutionException, InterruptedException {
+ return webClientResponse.get().content().as(responseType);
+ }
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/JavaTimeFormatter.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/JavaTimeFormatter.mustache
new file mode 100644
index 00000000000..f3fb34e559c
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/JavaTimeFormatter.mustache
@@ -0,0 +1,53 @@
+{{>licenseInfo}}
+package {{invokerPackage}};
+
+import java.time.OffsetDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+
+/**
+ * Class that add parsing/formatting support for Java 8+ {@code OffsetDateTime} class.
+ * It's generated for java clients when {@code AbstractJavaCodegen#dateLibrary} specified as {@code java8}.
+ */
+{{>generatedAnnotation}}
+public class JavaTimeFormatter {
+
+ private DateTimeFormatter offsetDateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
+
+ /**
+ * Get the date format used to parse/format {@code OffsetDateTime} parameters.
+ * @return DateTimeFormatter
+ */
+ public DateTimeFormatter getOffsetDateTimeFormatter() {
+ return offsetDateTimeFormatter;
+ }
+
+ /**
+ * Set the date format used to parse/format {@code OffsetDateTime} parameters.
+ * @param offsetDateTimeFormatter {@code DateTimeFormatter}
+ */
+ public void setOffsetDateTimeFormatter(DateTimeFormatter offsetDateTimeFormatter) {
+ this.offsetDateTimeFormatter = offsetDateTimeFormatter;
+ }
+
+ /**
+ * Parse the given string into {@code OffsetDateTime} object.
+ * @param str String
+ * @return {@code OffsetDateTime}
+ */
+ public OffsetDateTime parseOffsetDateTime(String str) {
+ try {
+ return OffsetDateTime.parse(str, offsetDateTimeFormatter);
+ } catch (DateTimeParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ /**
+ * Format the given {@code OffsetDateTime} object into string.
+ * @param offsetDateTime {@code OffsetDateTime}
+ * @return {@code OffsetDateTime} in string format
+ */
+ public String formatOffsetDateTime(OffsetDateTime offsetDateTime) {
+ return offsetDateTimeFormatter.format(offsetDateTime);
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/Pair.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/Pair.mustache
new file mode 100644
index 00000000000..e20dacb7742
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/Pair.mustache
@@ -0,0 +1,45 @@
+{{>licenseInfo}}
+
+package {{invokerPackage}};
+
+public class Pair {
+ private String name = "";
+ private String value = "";
+
+ public Pair (String name, String value) {
+ setName(name);
+ setValue(value);
+ }
+
+ private void setName(String name) {
+ if (!isValidString(name)) {
+ return;
+ }
+
+ this.name = name;
+ }
+
+ private void setValue(String value) {
+ if (!isValidString(value)) {
+ return;
+ }
+
+ this.value = value;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public String getValue() {
+ return this.value;
+ }
+
+ private boolean isValidString(String arg) {
+ if (arg == null) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/README.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/README.mustache
new file mode 100644
index 00000000000..eab4ac23ff7
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/README.mustache
@@ -0,0 +1,26 @@
+# {{appName}}
+
+{{#appDescriptionWithNewLines}}
+{{{.}}}
+
+{{/appDescriptionWithNewLines}}
+
+## Overview
+This project was generated using the Helidon OpenAPI Generator.
+
+The generated classes use the programming model from the Helidon WebClient implementation, primarily the `WebClient` interface and its
+`WebClient.Builder` class. Refer to the Helidon WebClient documentation for complete information about them.
+
+## Using the Generated Classes and Interfaces
+The generated `ApiClient` class wraps a `WebClient` instance. Similarly, the `ApiClient.Builder` class wraps the `WebClient.Builder` class.
+
+The generated `xxxApi` interfaces and `xxxApiImpl` classes make it very simple for your code to send requests (with input parameters) to the remote service which the OpenAPI document describes and to process the response (with output values) from the remote service.
+
+To use the generated API, your code performs the following steps.
+
+1. Create an instance of the `ApiClient` using its `Builder`.
+2. Create an instance of a `xxxApi` it wants to access, typically by invoking `xxxApiImpl.create(ApiClient)` and passing the `ApiClient` instance just created.
+3. Invoke any of the `public` methods on the `xxxApi` instance, passing the input parameters and saving the returned `Single` object.
+4. Invoke methods on the returned `Single` to process the response and any output from it.
+
+Browse the methods and JavaDoc on the generated classes for more information.
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/RFC3339DateFormat.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/RFC3339DateFormat.mustache
new file mode 100644
index 00000000000..311616a4ef1
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/RFC3339DateFormat.mustache
@@ -0,0 +1,46 @@
+{{>licenseInfo}}
+package {{invokerPackage}};
+
+import com.fasterxml.jackson.databind.util.StdDateFormat;
+
+import java.text.DateFormat;
+import java.text.FieldPosition;
+import java.text.ParsePosition;
+import java.util.Date;
+import java.text.DecimalFormat;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+public class RFC3339DateFormat extends DateFormat {
+ private static final long serialVersionUID = 1L;
+ private static final TimeZone TIMEZONE_Z = TimeZone.getTimeZone("UTC");
+
+ private final StdDateFormat fmt = new StdDateFormat()
+ .withTimeZone(TIMEZONE_Z)
+ .withColonInTimeZone(true);
+
+ public RFC3339DateFormat() {
+ this.calendar = new GregorianCalendar();
+ this.numberFormat = new DecimalFormat();
+ }
+
+ @Override
+ public Date parse(String source) {
+ return parse(source, new ParsePosition(0));
+ }
+
+ @Override
+ public Date parse(String source, ParsePosition pos) {
+ return fmt.parse(source, pos);
+ }
+
+ @Override
+ public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
+ return fmt.format(date, toAppendTo, fieldPosition);
+ }
+
+ @Override
+ public Object clone() {
+ return super.clone();
+ }
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ResponseType.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ResponseType.mustache
new file mode 100644
index 00000000000..d730fccb6c3
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/ResponseType.mustache
@@ -0,0 +1,32 @@
+{{>licenseInfo}}
+package {{apiPackage}};
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+import io.helidon.common.GenericType;
+
+class ResponseType {
+
+ static GenericType create(Type rawType, Type... typeParams) {
+ return typeParams.length == 0
+ ? GenericType.create(rawType)
+ : GenericType.create(new ParameterizedType() {
+
+ @Override
+ public Type[] getActualTypeArguments() {
+ return typeParams;
+ }
+
+ @Override
+ public Type getRawType() {
+ return rawType;
+ }
+
+ @Override
+ public Type getOwnerType() {
+ return null;
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/StringUtil.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/StringUtil.mustache
new file mode 100644
index 00000000000..e3d5d6e9088
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/StringUtil.mustache
@@ -0,0 +1,72 @@
+{{>licenseInfo}}
+
+package {{invokerPackage}};
+
+import java.util.Collection;
+import java.util.Iterator;
+
+{{>generatedAnnotation}}
+public class StringUtil {
+ /**
+ * Check if the given array contains the given value (with case-insensitive comparison).
+ *
+ * @param array The array
+ * @param value The value to search
+ * @return true if the array contains the value
+ */
+ public static boolean containsIgnoreCase(String[] array, String value) {
+ for (String str : array) {
+ if (value == null && str == null) {
+ return true;
+ }
+ if (value != null && value.equalsIgnoreCase(str)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Join an array of strings with the given separator.
+ *
+ * Note: This might be replaced by utility method from commons-lang or guava someday
+ * if one of those libraries is added as dependency.
+ *
+ *
+ * @param array The array of strings
+ * @param separator The separator
+ * @return the resulting string
+ */
+ public static String join(String[] array, String separator) {
+ int len = array.length;
+ if (len == 0) {
+ return "";
+ }
+
+ StringBuilder out = new StringBuilder();
+ out.append(array[0]);
+ for (int i = 1; i < len; i++) {
+ out.append(separator).append(array[i]);
+ }
+ return out.toString();
+ }
+
+ /**
+ * Join a list of strings with the given separator.
+ *
+ * @param list The list of strings
+ * @param separator The separator
+ * @return the resulting string
+ */
+ public static String join(Collection list, String separator) {
+ Iterator iterator = list.iterator();
+ StringBuilder out = new StringBuilder();
+ if (iterator.hasNext()) {
+ out.append(iterator.next());
+ }
+ while (iterator.hasNext()) {
+ out.append(separator).append(iterator.next());
+ }
+ return out.toString();
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/additionalEnumTypeAnnotations.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/additionalEnumTypeAnnotations.mustache
new file mode 100644
index 00000000000..aa524798b42
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/additionalEnumTypeAnnotations.mustache
@@ -0,0 +1,2 @@
+{{#additionalEnumTypeAnnotations}}{{{.}}}
+{{/additionalEnumTypeAnnotations}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/additionalModelTypeAnnotations.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/additionalModelTypeAnnotations.mustache
new file mode 100644
index 00000000000..f4871c02cc2
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/additionalModelTypeAnnotations.mustache
@@ -0,0 +1,2 @@
+{{#additionalModelTypeAnnotations}}{{{.}}}
+{{/additionalModelTypeAnnotations}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api.mustache
new file mode 100644
index 00000000000..f0d7ee5618a
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api.mustache
@@ -0,0 +1,43 @@
+{{>licenseInfo}}
+package {{package}};
+
+import {{invokerPackage}}.ApiResponse;
+{{#imports}}import {{import}};
+{{/imports}}
+
+{{#appName}}
+/**
+ * {{{appName}}}
+ *
+ {{#appDescription}}
+ * {{{.}}}
+ {{/appDescription}}
+ */
+{{/appName}}
+public interface {{classname}} {
+
+{{#operations}}
+{{#operation}}
+ {{#summary}}
+ /**
+ * {{summary}}
+ {{#notes}}
+ * {{.}}
+ {{/notes}}
+ {{#allParams}}
+ * @param {{paramName}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{^isContainer}}{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/isContainer}}{{/required}}
+ {{/allParams}}
+ * @return {@code {{>operationResponseSig}}}
+ {{#isDeprecated}}
+ * @deprecated
+ {{/isDeprecated}}
+ */
+ {{/summary}}
+ {{#isDeprecated}}
+ @Deprecated
+ {{/isDeprecated}}
+ {{>operationResponseSig}} {{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
+
+{{/operation}}
+{{/operations}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/apiOperation.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/apiOperation.mustache
new file mode 100644
index 00000000000..97adb0ea285
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/apiOperation.mustache
@@ -0,0 +1,28 @@
+{{>licenseInfo}}
+package {{invokerPackage}};
+
+import io.swagger.v3.oas.models.Operation;
+
+public class ApiOperation {
+ private final String path;
+ private final String method;
+ private final Operation operation;
+
+ public ApiOperation(String path, String method, Operation operation) {
+ this.path = path;
+ this.method = method;
+ this.operation = operation;
+ }
+
+ public Operation getOperation() {
+ return operation;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public String getMethod() {
+ return method;
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api_doc.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api_doc.mustache
new file mode 100644
index 00000000000..3d3203957e6
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api_doc.mustache
@@ -0,0 +1,108 @@
+# {{classname}}{{#description}}
+
+{{.}}{{/description}}
+
+All URIs are relative to *{{basePath}}*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+{{#operations}}{{#operation}}| [**{{operationId}}**]({{classname}}.md#{{operationId}}) | **{{httpMethod}}** {{commonPath}}{{path}} | {{summary}} |
+{{/operation}}{{/operations}}
+
+{{#operations}}
+{{#operation}}
+
+## {{operationId}}
+
+> {{#returnType}}{{.}} {{/returnType}}{{operationId}}({{#allParams}}{{{paramName}}}{{^-last}}, {{/-last}}{{/allParams}})
+
+{{summary}}{{#notes}}
+
+{{.}}{{/notes}}
+
+### Example
+
+```java
+// Import classes:
+import {{{invokerPackage}}}.ApiClient;
+import {{{invokerPackage}}}.ApiException;
+import {{{invokerPackage}}}.Configuration;{{#hasAuthMethods}}
+import {{{invokerPackage}}}.auth.*;{{/hasAuthMethods}}
+import {{{invokerPackage}}}.models.*;
+import {{{package}}}.{{{classname}}};
+
+public class Example {
+ public static void main(String[] args) {
+ ApiClient defaultClient = Configuration.getDefaultApiClient();
+ defaultClient.setBasePath("{{{basePath}}}");
+ {{#hasAuthMethods}}
+ {{#authMethods}}{{#isBasic}}{{#isBasicBasic}}
+ // Configure HTTP basic authorization: {{{name}}}
+ HttpBasicAuth {{{name}}} = (HttpBasicAuth) defaultClient.getAuthentication("{{{name}}}");
+ {{{name}}}.setUsername("YOUR USERNAME");
+ {{{name}}}.setPassword("YOUR PASSWORD");{{/isBasicBasic}}{{#isBasicBearer}}
+ // Configure HTTP bearer authorization: {{{name}}}
+ HttpBearerAuth {{{name}}} = (HttpBearerAuth) defaultClient.getAuthentication("{{{name}}}");
+ {{{name}}}.setBearerToken("BEARER TOKEN");{{/isBasicBearer}}{{/isBasic}}{{#isApiKey}}
+ // Configure API key authorization: {{{name}}}
+ ApiKeyAuth {{{name}}} = (ApiKeyAuth) defaultClient.getAuthentication("{{{name}}}");
+ {{{name}}}.setApiKey("YOUR API KEY");
+ // Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
+ //{{{name}}}.setApiKeyPrefix("Token");{{/isApiKey}}{{#isOAuth}}
+ // Configure OAuth2 access token for authorization: {{{name}}}
+ OAuth {{{name}}} = (OAuth) defaultClient.getAuthentication("{{{name}}}");
+ {{{name}}}.setAccessToken("YOUR ACCESS TOKEN");{{/isOAuth}}
+ {{/authMethods}}
+ {{/hasAuthMethods}}
+
+ {{{classname}}} apiInstance = new {{{classname}}}(defaultClient);
+ {{#allParams}}
+ {{{dataType}}} {{{paramName}}} = {{{example}}}; // {{{dataType}}} | {{{description}}}
+ {{/allParams}}
+ try {
+ {{#returnType}}{{{.}}} result = {{/returnType}}apiInstance.{{{operationId}}}({{#allParams}}{{{paramName}}}{{^-last}}, {{/-last}}{{/allParams}});{{#returnType}}
+ System.out.println(result);{{/returnType}}
+ } catch (ApiException e) {
+ System.err.println("Exception when calling {{{classname}}}#{{{operationId}}}");
+ System.err.println("Status code: " + e.getCode());
+ System.err.println("Reason: " + e.getResponseBody());
+ System.err.println("Response headers: " + e.getResponseHeaders());
+ e.printStackTrace();
+ }
+ }
+}
+```
+
+### Parameters
+
+{{^allParams}}This endpoint does not need any parameter.{{/allParams}}{{#allParams}}{{#-last}}
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|{{/-last}}{{/allParams}}
+{{#allParams}}| **{{paramName}}** | {{#isPrimitiveType}}**{{dataType}}**{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isFile}}**{{dataType}}**{{/isFile}}{{^isFile}}[**{{dataType}}**]({{baseType}}.md){{/isFile}}{{/isPrimitiveType}}| {{description}} |{{^required}} [optional]{{/required}}{{^isContainer}}{{#defaultValue}} [default to {{.}}]{{/defaultValue}}{{/isContainer}}{{#allowableValues}} [enum: {{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}]{{/allowableValues}} |
+{{/allParams}}
+
+### Return type
+
+{{#returnType}}{{#returnTypeIsPrimitive}}**{{returnType}}**{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}}[**{{returnType}}**]({{returnBaseType}}.md){{/returnTypeIsPrimitive}}{{/returnType}}{{^returnType}}null (empty response body){{/returnType}}
+
+### Authorization
+
+{{^authMethods}}No authorization required{{/authMethods}}{{#authMethods}}[{{name}}](../README.md#{{name}}){{^-last}}, {{/-last}}{{/authMethods}}
+
+### HTTP request headers
+
+- **Content-Type**: {{#consumes}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/consumes}}{{^consumes}}Not defined{{/consumes}}
+- **Accept**: {{#produces}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/produces}}{{^produces}}Not defined{{/produces}}
+
+{{#responses.0}}
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+{{#responses}}
+| **{{code}}** | {{message}} | {{#headers}} * {{baseName}} - {{description}}
{{/headers}}{{^headers.0}} - {{/headers.0}} |
+{{/responses}}
+{{/responses.0}}
+
+{{/operation}}
+{{/operations}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api_impl.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api_impl.mustache
new file mode 100644
index 00000000000..4da8503056b
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api_impl.mustache
@@ -0,0 +1,182 @@
+{{>licenseInfo}}
+package {{package}};
+
+import java.util.Objects;
+import {{invokerPackage}}.ApiResponse;
+
+{{#jsonb}}
+import {{rootJavaEEPackage}}.json.bind.JsonbBuilder;
+{{/jsonb}}
+{{#jackson}}
+import com.fasterxml.jackson.databind.ObjectMapper;
+{{/jackson}}
+
+import io.helidon.common.GenericType;
+import io.helidon.common.http.MediaType;
+import io.helidon.common.reactive.Single;
+import io.helidon.config.Config;
+import io.helidon.media.common.MediaSupport;
+{{#jsonb}}import io.helidon.media.jsonb.JsonbSupport;{{/jsonb}}
+{{#jackson}}import io.helidon.media.jackson.JacksonSupport;{{/jackson}}
+import io.helidon.webclient.WebClientRequestBuilder;
+import io.helidon.webclient.WebClientResponse;
+
+import {{invokerPackage}}.ApiClient;
+
+{{#x-helidon-implImports}}import {{import}};
+{{/x-helidon-implImports}}
+
+{{#appName}}
+/**
+ * {{{appName}}}
+ *
+ {{#appDescription}}
+ *
{{{.}}}
+ {{/appDescription}}
+ */
+{{/appName}}
+public class {{classname}}Impl implements {{classname}} {
+
+ private final ApiClient apiClient;
+
+{{#operations}}
+ {{#operation}}
+ protected static final GenericType<{{>operationResponseTypeDecl}}> RESPONSE_TYPE_{{operationId}} = ResponseType.create({{#isArray}}List.class, {{/isArray}}{{#isMap}}Map.class, String.class, {{/isMap}}{{#returnBaseType}}{{returnBaseType}}{{/returnBaseType}}{{^returnBaseType}}Void{{/returnBaseType}}.class);
+ {{/operation}}
+{{/operations}}
+
+ /**
+ * Creates a new instance of {{classname}}Impl initialized with the specified {@link ApiClient}.
+ *
+ */
+ public static {{classname}}Impl create(ApiClient apiClient) {
+ return new {{classname}}Impl(apiClient);
+ }
+
+ protected {{classname}}Impl(ApiClient apiClient) {
+ this.apiClient = apiClient;
+ }
+
+{{#operations}}
+{{#operation}}
+ {{#isDeprecated}}
+ @Deprecated
+ {{/isDeprecated}}
+ @Override
+ public {{>operationResponseSig}} {{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) {
+ {{#requiredParams}}
+ Objects.requireNonNull({{paramName}}, "Required parameter '{{paramName}}' not specified");
+ {{/requiredParams}}
+ WebClientRequestBuilder webClientRequestBuilder = {{operationId}}RequestBuilder({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
+ return {{operationId}}Submit(webClientRequestBuilder{{#allParams}}, {{paramName}}{{/allParams}});
+ }
+
+ /**
+ * Creates a {@code WebClientRequestBuilder} for the {{operationId}} operation.
+ * Optional customization point for subclasses.
+ *
+ {{#allParams}}
+ * @param {{paramName}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{^isContainer}}{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/isContainer}}{{/required}}
+ {{/allParams}}
+ * @return WebClientRequestBuilder for {{operationId}}
+ */
+ protected WebClientRequestBuilder {{operationId}}RequestBuilder({{#allParams}}{{{dataType}}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}) {
+ WebClientRequestBuilder webClientRequestBuilder = apiClient.webClient()
+ .method("{{httpMethod}}");
+
+ {{#hasQueryParams}}
+ {{javaUtilPrefix}}List queryParams = new {{javaUtilPrefix}}ArrayList<>();
+ {{#queryParams}}
+ {{#collectionFormat}}
+ queryParams.addAll(ApiClient.parameterToPairs("{{{collectionFormat}}}", "{{baseName}}", {{paramName}}));
+ {{/collectionFormat}}
+ {{^collectionFormat}}
+ {{#isDeepObject}}
+ if ({{paramName}} != null) {
+ {{#items.vars}}
+ queryParams.addAll(ApiClient.parameterToPairs({{#isArray}}"csv", {{/isArray}}"{{baseName}}", {{paramName}}.{{getter}}()));
+ {{/items.vars}}
+ }
+ {{/isDeepObject}}
+ {{^isDeepObject}}
+ {{#isExplode}}
+ {{#hasVars}}
+ {{#vars}}
+ queryParams.addAll(ApiClent.parameterToPairs("{{baseName}}", {{paramName}}.{{getter}}()));
+ {{/vars}}
+ {{/hasVars}}
+ {{^hasVars}}
+ queryParams.addAll(ApiClient.parameterToPairs("{{baseName}}", {{paramName}}));
+ {{/hasVars}}
+ {{/isExplode}}
+ {{^isExplode}}
+ queryParams.addAll(ApiClient.parameterToPairs("{{baseName}}", {{paramName}}));
+ {{/isExplode}}
+ {{/isDeepObject}}
+ {{/collectionFormat}}
+ {{/queryParams}}
+ queryParams.forEach(p -> webClientRequestBuilder.queryParam(p.getName(), p.getValue()));
+
+ {{/hasQueryParams}}
+ {{#hasHeaderParams}}
+ WebClientRequestHeaders headers = webClientRequestBuilder.headers();
+ {{#headerParams}}
+ if ({{paramName}} != null) {
+ headers.put("{{baseName}}", {{paramName}}{{^isString}}.toString(){{/isString}});
+ }
+ {{/headerParams}}
+
+ {{/hasHeaderParams}}
+ {{#hasCookieParams}}
+ String cookies = new StringJoiner("; ")
+ {{#cookieParams}}
+ .add("{{{baseName}}}=" + {{{paramName}}})
+ {{/cookieParams}}
+ .toString();
+ webClientRequestBuilder.headers().add("Cookie", cookies);
+
+ {{/hasCookieParams}}
+ {{#hasPathParams}}
+ String path = "{{{path}}}"
+ {{! Switch delimiters from double braces to <% and %> for baseName so we can use curly braces in the string as literals and not have mustache
+ interpret them, then switch back. }}
+ {{#pathParams}}
+ .replace({{=<% %>=}}"{<%baseName%>}"<%={{ }}=%>, ApiClient.urlEncode({{{paramName}}}{{^isString}}.toString(){{/isString}})){{/pathParams}};
+ {{/hasPathParams}}
+ webClientRequestBuilder.path({{#hasPathParams}}path{{/hasPathParams}}{{^hasPathParams}}"{{{path}}}"{{/hasPathParams}});
+ {{#bodyParam}}
+ webClientRequestBuilder.contentType(MediaType.APPLICATION_JSON);
+ {{/bodyParam}}
+ {{#hasFormParams}}
+ webClientRequestBuilder.contentType(MediaType.APPLICATION_FORM_URLENCODED);
+ {{/hasFormParams}}
+ webClientRequestBuilder.accept(MediaType.APPLICATION_JSON);
+
+ return webClientRequestBuilder;
+ }
+
+ /**
+ * Initiates the request for the {{operationId}} operation.
+ * Optional customization point for subclasses.
+ *
+ * @param webClientRequestBuilder the request builder to use for submitting the request
+ {{#allParams}}
+ * @param {{paramName}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{^isContainer}}{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/isContainer}}{{/required}}
+ {{/allParams}}
+ * @return {@code {{>operationResponseSig}}} for the submitted request
+ */
+ protected {{>operationResponseSig}} {{operationId}}Submit(WebClientRequestBuilder webClientRequestBuilder{{#allParams}}, {{{dataType}}} {{paramName}}{{/allParams}}) {
+ {{#hasFormParams}}
+ String formParams = new StringJoiner("&")
+ {{#formParams}}
+ .add("{{{baseName}}}=" + {{paramName}})
+ {{/formParams}}
+ .toString();
+ {{/hasFormParams}}
+ Single webClientResponse = webClientRequestBuilder.submit({{#bodyParam}}{{paramName}}{{/bodyParam}}{{#hasFormParams}}formParams{{/hasFormParams}});
+ return ApiResponse.create(RESPONSE_TYPE_{{operationId}}, webClientResponse);
+ }
+
+{{/operation}}
+{{/operations}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api_test.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api_test.mustache
new file mode 100644
index 00000000000..de7bb1db80e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/api_test.mustache
@@ -0,0 +1,72 @@
+{{>licenseInfo}}
+
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+
+import {{invokerPackage}}.ApiClient;
+import {{invokerPackage}}.ApiResponse;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+{{^fullJavaUtil}}
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+{{/fullJavaUtil}}
+
+import io.helidon.common.reactive.Single;
+import io.helidon.webclient.WebClientResponse;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * {{#appName}}
+ * {{{.}}} Test
+ *
+ * {{/appName}}
+ * API tests for {{classname}}
+ */
+public class {{classname}}Test {
+
+ private static ApiClient apiClient;
+ private static {{classname}} api;
+ private static final String baseUrl = "http://localhost:8080";
+
+ @BeforeAll
+ public static void setup() {
+ apiClient = ApiClient.builder().build();
+ api = {{classname}}Impl.create(apiClient);
+ }
+
+ {{#operations}}
+ {{#operation}}
+ /**
+ * {{summary}}
+ {{#notes}}
+ * {{.}}
+ {{/notes}}
+ */
+ @Test
+ public void {{operationId}}Test() {
+ {{#allParams}}
+ // TODO - assign values to the input arguments.
+ {{{dataType}}} {{paramName}} = null;
+ {{/allParams}}
+
+ // TODO - uncomment the following two lines to invoke the service with valid parameters.
+ //ApiResponse<{{>operationResponseTypeDecl}}> response = api.{{operationId}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
+ //response.webClientResponse().await();
+ // TODO - check for appropriate return status
+ // assertThat("Return status", response.get().status().code(), is(expectedStatus));
+
+ // TODO: test validations
+ }
+
+ {{/operation}}
+ {{/operations}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/bodyParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/bodyParams.mustache
new file mode 100644
index 00000000000..c7d1abfe527
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/bodyParams.mustache
@@ -0,0 +1 @@
+{{#isBodyParam}}{{{dataType}}} {{paramName}}{{/isBodyParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/cookieParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/cookieParams.mustache
new file mode 100644
index 00000000000..fea14348d7f
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/cookieParams.mustache
@@ -0,0 +1 @@
+{{#isCookieParam}}@CookieParam("{{baseName}}"){{^isContainer}}{{#defaultValue}} @DefaultValue("{{{.}}}"){{/defaultValue}}{{/isContainer}} {{#useSwaggerAnnotations}}{{#description}} @ApiParam("{{.}}"){{/description}}{{/useSwaggerAnnotations}} {{{dataType}}} {{paramName}}{{/isCookieParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/enumClass.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/enumClass.mustache
new file mode 100644
index 00000000000..d32efebf489
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/enumClass.mustache
@@ -0,0 +1,46 @@
+{{#jsonb}}
+ @JsonbTypeSerializer({{datatypeWithEnum}}.Serializer.class)
+ @JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class)
+{{/jsonb}}
+{{>additionalEnumTypeAnnotations}}public enum {{datatypeWithEnum}} {
+
+ {{#allowableValues}}
+ {{#enumVars}}{{name}}({{dataType}}.valueOf({{{value}}})){{^-last}}, {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}
+ {{/allowableValues}}
+
+ {{dataType}} value;
+
+ {{datatypeWithEnum}} ({{dataType}} v) {
+ value = v;
+ }
+
+ public {{dataType}} value() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ {{#jsonb}}
+ public static final class Deserializer implements JsonbDeserializer<{{datatypeWithEnum}}> {
+ @Override
+ public {{datatypeWithEnum}} deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (String.valueOf(b.value).equals(parser.getString())) {
+ return b;
+ }
+ }
+ {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + parser.getString() + "'");{{/useNullForUnknownEnumValue}}
+ }
+ }
+
+ public static final class Serializer implements JsonbSerializer<{{datatypeWithEnum}}> {
+ @Override
+ public void serialize({{datatypeWithEnum}} obj, JsonGenerator generator, SerializationContext ctx) {
+ generator.write(obj.value);
+ }
+ }
+ {{/jsonb}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/enumOuterClass.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/enumOuterClass.mustache
new file mode 100644
index 00000000000..39417c635f8
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/enumOuterClass.mustache
@@ -0,0 +1,39 @@
+{{#jackson}}
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+{{/jackson}}
+
+/**
+ * {{description}}{{^description}}Gets or Sets {{{name}}}{{/description}}
+ */
+{{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} {
+ {{#allowableValues}}{{#enumVars}}
+ {{{name}}}({{{value}}}){{^-last}},
+ {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}}
+
+ private {{{dataType}}} value;
+
+ {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}({{{dataType}}} value) {
+ this.value = value;
+ }
+
+ @Override
+{{#jackson}}
+ @JsonValue
+{{/jackson}}
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+{{#jackson}}
+ @JsonCreator
+{{/jackson}}
+ public static {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue(String text) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (String.valueOf(b.value).equals(text)) {
+ return b;
+ }
+ }
+ {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + text + "'");{{/useNullForUnknownEnumValue}}
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/enum_outer_doc.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/enum_outer_doc.mustache
new file mode 100644
index 00000000000..20c512aaeae
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/enum_outer_doc.mustache
@@ -0,0 +1,7 @@
+# {{classname}}
+
+## Enum
+
+{{#allowableValues}}{{#enumVars}}
+* `{{name}}` (value: `{{{value}}}`)
+{{/enumVars}}{{/allowableValues}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/formParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/formParams.mustache
new file mode 100644
index 00000000000..fa85e0c8947
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/formParams.mustache
@@ -0,0 +1 @@
+{{#isFormParam}}@FormParam("{{baseName}}") {{{dataType}}} {{paramName}}{{/isFormParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/generatedAnnotation.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/generatedAnnotation.mustache
new file mode 100644
index 00000000000..356a48872aa
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/generatedAnnotation.mustache
@@ -0,0 +1 @@
+@{{rootJavaEEPackage}}.annotation.Generated(value = "{{generatorClass}}"{{^hideGenerationTimestamp}}, date = "{{generatedDate}}"{{/hideGenerationTimestamp}})
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/headerParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/headerParams.mustache
new file mode 100644
index 00000000000..25d690c90ed
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/headerParams.mustache
@@ -0,0 +1 @@
+{{#isHeaderParam}}@HeaderParam("{{baseName}}") {{{dataType}}} {{paramName}}{{/isHeaderParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/jackson_annotations.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/jackson_annotations.mustache
new file mode 100644
index 00000000000..ccde126f54e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/jackson_annotations.mustache
@@ -0,0 +1,19 @@
+{{!
+ If this is map and items are nullable, make sure that nulls are included.
+ To determine what JsonInclude.Include method to use, consider the following:
+ * If the field is required, always include it, even if it is null.
+ * Else use custom behaviour, IOW use whatever is defined on the object mapper
+ }}
+ @JsonProperty(JSON_PROPERTY_{{nameInSnakeCase}})
+ @JsonInclude({{#isMap}}{{#items.isNullable}}content = JsonInclude.Include.ALWAYS, {{/items.isNullable}}{{/isMap}}value = JsonInclude.Include.{{#required}}ALWAYS{{/required}}{{^required}}USE_DEFAULTS{{/required}})
+ {{#withXml}}
+ {{^isContainer}}
+ @JacksonXmlProperty({{#isXmlAttribute}}isAttribute = true, {{/isXmlAttribute}}{{#xmlNamespace}}namespace="{{.}}", {{/xmlNamespace}}localName = "{{xmlName}}{{^xmlName}}{{baseName}}{{/xmlName}}")
+ {{/isContainer}}
+ {{#isContainer}}
+ {{#isXmlWrapped}}
+ // items.xmlName={{items.xmlName}}
+ @JacksonXmlElementWrapper(useWrapping = {{isXmlWrapped}}, {{#xmlNamespace}}namespace="{{.}}", {{/xmlNamespace}}localName = "{{#items.xmlName}}{{items.xmlName}}{{/items.xmlName}}{{^items.xmlName}}{{items.baseName}}{{/items.xmlName}}")
+ {{/isXmlWrapped}}
+ {{/isContainer}}
+ {{/withXml}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/licenseInfo.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/licenseInfo.mustache
new file mode 100644
index 00000000000..be193d0c4fe
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/licenseInfo.mustache
@@ -0,0 +1,11 @@
+/**
+ * {{{appName}}}
+ * {{{appDescription}}}
+ *
+ * {{#version}}The version of the OpenAPI document: {{{.}}}{{/version}}
+ * {{#infoEmail}}Contact: {{{.}}}{{/infoEmail}}
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/manifest.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/manifest.mustache
new file mode 100644
index 00000000000..f44bd07d0a0
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/manifest.mustache
@@ -0,0 +1,3 @@
+
+
+
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/maven.yml.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/maven.yml.mustache
new file mode 100644
index 00000000000..f3c4733c306
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/maven.yml.mustache
@@ -0,0 +1,31 @@
+# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
+# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
+#
+# This file is auto-generated by OpenAPI Generator (https://openapi-generator.tech)
+
+name: Java CI with Maven
+
+on:
+ push:
+ branches: [ main, master ]
+ pull_request:
+ branches: [ main, master ]
+
+jobs:
+ build:
+ name: Build {{{appName}}}
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ java: [ '8' ]
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up JDK
+ uses: actions/setup-java@v2
+ with:
+ {{=< >=}}
+ java-version: ${{ matrix.java }}
+ distribution: 'temurin'
+ cache: maven
+ - name: Build with Maven
+ run: mvn -B package --no-transfer-progress --file pom.xml
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/model.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/model.mustache
new file mode 100644
index 00000000000..ad4e98b8a45
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/model.mustache
@@ -0,0 +1,19 @@
+{{>licenseInfo}}
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+{{#serializableModel}}
+import java.io.Serializable;
+{{/serializableModel}}
+
+{{#models}}
+{{#model}}
+{{#isEnum}}
+{{>enumOuterClass}}
+{{/isEnum}}
+{{^isEnum}}
+{{>pojo}}
+{{/isEnum}}
+{{/model}}
+{{/models}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/modelInnerEnum.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/modelInnerEnum.mustache
new file mode 100644
index 00000000000..a9c99783fd0
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/modelInnerEnum.mustache
@@ -0,0 +1,95 @@
+ /**
+ * {{description}}{{^description}}Gets or Sets {{{name}}}{{/description}}
+ */
+{{#gson}}
+ @JsonAdapter({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}.Adapter.class)
+{{/gson}}
+{{#jsonb}}
+ @JsonbTypeSerializer({{datatypeWithEnum}}.Serializer.class)
+ @JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class)
+{{/jsonb}}
+{{#withXml}}
+ @XmlType(name="{{datatypeWithEnum}}")
+ @XmlEnum({{dataType}}.class)
+{{/withXml}}
+ {{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} {
+ {{#allowableValues}}
+ {{#enumVars}}
+ {{#enumDescription}}
+ /**
+ * {{.}}
+ */
+ {{/enumDescription}}
+ {{#withXml}}
+ @XmlEnumValue({{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}}{{{value}}}{{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}})
+ {{/withXml}}
+ {{{name}}}({{{value}}}){{^-last}},
+ {{/-last}}{{#-last}};{{/-last}}
+ {{/enumVars}}
+ {{/allowableValues}}
+
+ private {{{dataType}}} value;
+
+ {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}({{{dataType}}} value) {
+ this.value = value;
+ }
+
+{{#jackson}}
+ @JsonValue
+{{/jackson}}
+ public {{{dataType}}} getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+{{#jackson}}
+ @JsonCreator
+{{/jackson}}
+ public static {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue({{{dataType}}} value) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ {{#isNullable}}return null;{{/isNullable}}{{^isNullable}}throw new IllegalArgumentException("Unexpected value '" + value + "'");{{/isNullable}}
+ }
+{{#gson}}
+
+ public static class Adapter extends TypeAdapter<{{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}> {
+ @Override
+ public void write(final JsonWriter jsonWriter, final {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} enumeration) throws IOException {
+ jsonWriter.value(enumeration.getValue());
+ }
+
+ @Override
+ public {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} read(final JsonReader jsonReader) throws IOException {
+ {{^isNumber}}{{{dataType}}}{{/isNumber}}{{#isNumber}}String{{/isNumber}} value = {{#isFloat}}(float){{/isFloat}} jsonReader.{{#isNumber}}nextString(){{/isNumber}}{{#isInteger}}nextInt(){{/isInteger}}{{^isNumber}}{{^isInteger}}{{#isFloat}}nextDouble{{/isFloat}}{{^isFloat}}next{{{dataType}}}{{/isFloat}}(){{/isInteger}}{{/isNumber}};
+ return {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}.fromValue({{#isNumber}}new BigDecimal({{/isNumber}}value{{#isNumber}}){{/isNumber}});
+ }
+ }
+{{/gson}}
+{{#jsonb}}
+ public static final class Deserializer implements JsonbDeserializer<{{datatypeWithEnum}}> {
+ @Override
+ public {{datatypeWithEnum}} deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (String.valueOf(b.value).equals(parser.getString())) {
+ return b;
+ }
+ }
+ {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + parser.getString() + "'");{{/useNullForUnknownEnumValue}}
+ }
+ }
+
+ public static final class Serializer implements JsonbSerializer<{{datatypeWithEnum}}> {
+ @Override
+ public void serialize({{datatypeWithEnum}} obj, JsonGenerator generator, SerializationContext ctx) {
+ generator.write(obj.value);
+ }
+ }
+{{/jsonb}}
+ }
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/model_doc.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/model_doc.mustache
new file mode 100644
index 00000000000..9a7fe146a4e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/model_doc.mustache
@@ -0,0 +1,4 @@
+{{#models}}{{#model}}
+
+{{#isEnum}}{{>enum_outer_doc}}{{/isEnum}}{{^isEnum}}{{>pojo_doc}}{{/isEnum}}
+{{/model}}{{/models}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/model_test.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/model_test.mustache
new file mode 100644
index 00000000000..92c1e7ee2e3
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/model_test.mustache
@@ -0,0 +1,49 @@
+{{>licenseInfo}}
+
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+
+import org.junit.jupiter.api.Test;
+
+{{#fullJavaUtil}}
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+{{/fullJavaUtil}}
+
+/**
+ * Model tests for {{classname}}
+ */
+public class {{classname}}Test {
+ {{#models}}
+ {{#model}}
+ {{^vendorExtensions.x-is-one-of-interface}}
+ {{^isEnum}}
+ private final {{classname}} model = new {{classname}}();
+
+ {{/isEnum}}
+ /**
+ * Model tests for {{classname}}
+ */
+ @Test
+ public void test{{classname}}() {
+ // TODO: test {{classname}}
+ }
+
+ {{#allVars}}
+ /**
+ * Test the property '{{name}}'
+ */
+ @Test
+ public void {{name}}Test() {
+ // TODO: test {{name}}
+ }
+
+ {{/allVars}}
+ {{/vendorExtensions.x-is-one-of-interface}}
+ {{/model}}
+ {{/models}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/oneof_interface.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/oneof_interface.mustache
new file mode 100644
index 00000000000..02deb483d5f
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/oneof_interface.mustache
@@ -0,0 +1,6 @@
+{{>additionalModelTypeAnnotations}}{{>generatedAnnotation}}{{>typeInfoAnnotation}}{{>xmlAnnotation}}
+public interface {{classname}} {{#vendorExtensions.x-implements}}{{#-first}}extends {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
+ {{#discriminator}}
+ public {{propertyType}} {{propertyGetter}}();
+ {{/discriminator}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/openapi.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/openapi.mustache
new file mode 100644
index 00000000000..34fbb53f331
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/openapi.mustache
@@ -0,0 +1 @@
+{{{openapi-yaml}}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/operationResponseSig.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/operationResponseSig.mustache
new file mode 100644
index 00000000000..499dc7ede7a
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/operationResponseSig.mustache
@@ -0,0 +1 @@
+ApiResponse<{{>operationResponseTypeDecl}}>
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/operationResponseTypeDecl.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/operationResponseTypeDecl.mustache
new file mode 100644
index 00000000000..47f72007025
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/operationResponseTypeDecl.mustache
@@ -0,0 +1 @@
+{{#returnType}}{{#isArray}}List<{{/isArray}}{{#isMap}}Map{{/isArray}}{{#isMap}}>{{/isMap}}{{/returnType}}{{^returnType}}Void{{/returnType}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pathParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pathParams.mustache
new file mode 100644
index 00000000000..ba153467a65
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pathParams.mustache
@@ -0,0 +1 @@
+{{#isPathParam}}@PathParam("{{baseName}}") {{{dataType}}} {{paramName}}{{/isPathParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pojo.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pojo.mustache
new file mode 100644
index 00000000000..84115fa7d02
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pojo.mustache
@@ -0,0 +1,155 @@
+
+{{#jsonb}}
+import java.lang.reflect.Type;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeDeserializer;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.DeserializationContext;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbDeserializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.SerializationContext;
+import {{rootJavaEEPackage}}.json.stream.JsonGenerator;
+import {{rootJavaEEPackage}}.json.stream.JsonParser;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbProperty;
+{{#vendorExtensions.x-has-readonly-properties}}
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbCreator;
+{{/vendorExtensions.x-has-readonly-properties}}
+{{/jsonb}}
+
+{{#description}}
+/**
+ * {{{.}}}
+ **/
+{{/description}}
+{{>additionalModelTypeAnnotations}}
+{{#vendorExtensions.x-class-extra-annotation}}
+{{{vendorExtensions.x-class-extra-annotation}}}
+{{/vendorExtensions.x-class-extra-annotation}}
+public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
+ {{#vars}}{{#isEnum}}{{^isContainer}}
+{{>enumClass}}{{/isContainer}}{{#isContainer}}{{#mostInnerItems}}
+{{>enumClass}}{{/mostInnerItems}}{{/isContainer}}{{/isEnum}}
+{{#description}}
+ /**
+ * {{{.}}}
+ **/
+{{/description}}
+{{#vendorExtensions.x-field-extra-annotation}}
+{{{vendorExtensions.x-field-extra-annotation}}}
+{{/vendorExtensions.x-field-extra-annotation}}
+{{#isContainer}}
+ private {{{datatypeWithEnum}}} {{name}}{{#required}} = {{{defaultValue}}}{{/required}}{{^required}} = null{{/required}};
+{{/isContainer}}
+{{^isContainer}}
+ private {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};
+{{/isContainer}}
+ {{/vars}}
+{{#vendorExtensions.x-has-readonly-properties}}{{#jsonb}}
+ public {{classname}}() {
+ }
+
+ @JsonbCreator
+ public {{classname}}(
+ {{#readOnlyVars}}
+ @JsonbProperty("{{baseName}}") {{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}
+ {{/readOnlyVars}}
+ ) {
+ {{#readOnlyVars}}
+ this.{{name}} = {{name}};
+ {{/readOnlyVars}}
+ }
+ {{/jsonb}}{{/vendorExtensions.x-has-readonly-properties}}
+ {{#vars}}
+ /**
+ {{#description}}
+ * {{.}}
+ {{/description}}
+ {{^description}}
+ * Get {{name}}
+ {{/description}}
+ {{#minimum}}
+ * minimum: {{.}}
+ {{/minimum}}
+ {{#maximum}}
+ * maximum: {{.}}
+ {{/maximum}}
+ * @return {{name}}
+ {{#deprecated}}
+ * @deprecated
+ {{/deprecated}}
+ **/
+{{#deprecated}}
+ @Deprecated
+{{/deprecated}}
+{{#vendorExtensions.x-extra-annotation}}
+ {{{vendorExtensions.x-extra-annotation}}}
+{{/vendorExtensions.x-extra-annotation}}
+ {{#withXml}}{{#isEnum}}{{^isArray}}{{^isMap}}public {{dataType}} {{getter}}() {
+ if ({{name}} == null) {
+ return null;
+ }
+ return {{name}}.value();
+ }{{/isMap}}{{/isArray}}{{/isEnum}}{{/withXml}}{{^withXml}}{{#isEnum}}{{^isArray}}{{^isMap}}public {{datatypeWithEnum}} {{getter}}() {
+ return {{name}};
+ }{{/isMap}}{{/isArray}}{{/isEnum}}{{/withXml}}{{#isEnum}}{{#isArray}}public {{{datatypeWithEnum}}} {{getter}}() {
+ return {{name}};
+ }{{/isArray}}{{/isEnum}}{{#isEnum}}{{#isMap}}public {{{datatypeWithEnum}}} {{getter}}() {
+ return {{name}};
+ }{{/isMap}}{{/isEnum}}{{^isEnum}}public {{{datatypeWithEnum}}} {{getter}}() {
+ return {{name}};
+ }{{/isEnum}}
+
+ {{^isReadOnly}}
+ /**
+ * Set {{name}}
+ **/
+ {{#vendorExtensions.x-setter-extra-annotation}} {{{vendorExtensions.x-setter-extra-annotation}}}
+ {{/vendorExtensions.x-setter-extra-annotation}}public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {
+ this.{{name}} = {{name}};
+ }
+
+ public {{classname}} {{name}}({{{datatypeWithEnum}}} {{name}}) {
+ this.{{name}} = {{name}};
+ return this;
+ }
+ {{#isArray}}
+
+ public {{classname}} add{{nameInCamelCase}}Item({{{items.datatypeWithEnum}}} {{name}}Item) {
+ this.{{name}}.add({{name}}Item);
+ return this;
+ }
+ {{/isArray}}
+ {{#isMap}}
+
+ public {{classname}} put{{nameInCamelCase}}Item(String key, {{{items.datatypeWithEnum}}} {{name}}Item) {
+ this.{{name}}.put(key, {{name}}Item);
+ return this;
+ }
+ {{/isMap}}
+ {{/isReadOnly}}
+
+ {{/vars}}
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class {{classname}} {\n");
+ {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}}
+ {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n");
+ {{/vars}}sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pojo_doc.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pojo_doc.mustache
new file mode 100644
index 00000000000..bae0bc48cdd
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pojo_doc.mustache
@@ -0,0 +1,37 @@
+# {{#vendorExtensions.x-is-one-of-interface}}Interface {{/vendorExtensions.x-is-one-of-interface}}{{classname}}
+
+{{#description}}{{&description}}
+{{/description}}
+{{^vendorExtensions.x-is-one-of-interface}}
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+{{#vars}}|**{{name}}** | {{#isEnum}}[**{{datatypeWithEnum}}**](#{{datatypeWithEnum}}){{/isEnum}}{{^isEnum}}{{#isContainer}}{{#isArray}}{{#items}}{{#isModel}}[{{/isModel}}{{/items}}**{{baseType}}{{#items}}<{{dataType}}>**{{#isModel}}]({{^baseType}}{{dataType}}{{/baseType}}{{baseType}}.md){{/isModel}}{{/items}}{{/isArray}}{{#isMap}}{{#items}}{{#isModel}}[{{/isModel}}**Map<String, {{dataType}}>**{{#isModel}}]({{^baseType}}{{dataType}}{{/baseType}}{{baseType}}.md){{/isModel}}{{/items}}{{/isMap}}{{/isContainer}}{{^isContainer}}{{#isModel}}[{{/isModel}}**{{dataType}}**{{#isModel}}]({{^baseType}}{{dataType}}{{/baseType}}{{baseType}}.md){{/isModel}}{{/isContainer}}{{/isEnum}} | {{description}} | {{^required}} [optional]{{/required}}{{#isReadOnly}} [readonly]{{/isReadOnly}} |
+{{/vars}}
+{{#vars}}{{#isEnum}}
+
+
+## Enum: {{datatypeWithEnum}}
+
+| Name | Value |
+|---- | -----|{{#allowableValues}}{{#enumVars}}
+| {{name}} | {{value}} |{{/enumVars}}{{/allowableValues}}
+{{/isEnum}}{{/vars}}
+{{#vendorExtensions.x-implements.0}}
+
+## Implemented Interfaces
+
+{{#vendorExtensions.x-implements}}
+* {{{.}}}
+{{/vendorExtensions.x-implements}}
+{{/vendorExtensions.x-implements.0}}
+{{/vendorExtensions.x-is-one-of-interface}}
+{{#vendorExtensions.x-is-one-of-interface}}
+## Implementing Classes
+
+{{#oneOf}}
+* {{{.}}}
+{{/oneOf}}
+{{/vendorExtensions.x-is-one-of-interface}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pom.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pom.mustache
new file mode 100644
index 00000000000..489af6b1576
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/pom.mustache
@@ -0,0 +1,83 @@
+
+ 4.0.0
+ {{groupId}}
+
+ io.helidon.applications
+ helidon-se
+ {{helidonVersion}}
+
+
+ {{artifactId}}
+ {{artifactId}}
+ {{#appDescription}}
+ {{.}}
+ {{/appDescription}}
+ {{artifactVersion}}
+ jar
+
+
+
+ io.helidon.webclient
+ helidon-webclient
+
+
+ io.helidon.config
+ helidon-config
+
+
+ {{x-helidon-rootJavaEEDepPrefix}}.json
+ {{x-helidon-rootJavaEEDepPrefix}}.json-api
+
+{{#jackson}}
+
+ io.helidon.media
+ helidon-media-jackson
+
+
+ org.glassfish.jersey.media
+ jersey-media-json-jackson
+
+
+ org.openapitools
+ jackson-databind-nullable
+ 0.2.2
+
+{{/jackson}}
+{{#jsonb}}
+
+ org.glassfish.jersey.media
+ jersey-media-json-binding
+
+
+ {{x-helidon-rootJavaEEDepPrefix}}.json.bind
+ {{x-helidon-rootJavaEEDepPrefix}}.json.bind-api
+
+{{/jsonb}}
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ org.hamcrest
+ hamcrest-all
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-libs
+
+
+
+
+
+
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/queryParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/queryParams.mustache
new file mode 100644
index 00000000000..4b1a980896f
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/queryParams.mustache
@@ -0,0 +1 @@
+{{#isQueryParam}}@QueryParam("{{baseName}}") {{^isContainer}}{{#defaultValue}}@DefaultValue("{{{.}}}") {{/defaultValue}}{{/isContainer}}{{{dataType}}} {{paramName}}{{/isQueryParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/returnTypes.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/returnTypes.mustache
new file mode 100644
index 00000000000..32f96a90472
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/returnTypes.mustache
@@ -0,0 +1,4 @@
+{{#useGenericResponse}}Response{{/useGenericResponse}}{{! non-generic response:
+}}{{^useGenericResponse}}{{!
+}}{{{returnType}}}{{!
+}}{{/useGenericResponse}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/typeInfoAnnotation.mustache b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/typeInfoAnnotation.mustache
new file mode 100644
index 00000000000..c833321ebfa
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/client/libraries/se/typeInfoAnnotation.mustache
@@ -0,0 +1,17 @@
+{{#jackson}}
+
+@JsonIgnoreProperties(
+ value = "{{{discriminator.propertyBaseName}}}", // ignore manually set {{{discriminator.propertyBaseName}}}, it will be automatically generated by Jackson during serialization
+ allowSetters = true // allows the {{{discriminator.propertyBaseName}}} to be set during deserialization
+)
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true)
+{{#discriminator.mappedModels}}
+{{#-first}}
+@JsonSubTypes({
+{{/-first}}
+ @JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
+{{#-last}}
+})
+{{/-last}}
+{{/discriminator.mappedModels}}
+{{/jackson}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/common/README.mustache b/modules/openapi-generator/src/main/resources/java-helidon/common/README.mustache
new file mode 100644
index 00000000000..961c4207f43
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/common/README.mustache
@@ -0,0 +1,9 @@
+# {{appName}}
+
+{{#appDescriptionWithNewLines}}
+{{{.}}}
+
+{{/appDescriptionWithNewLines}}
+
+## Overview
+This project was generated using the Helidon OpenAPI Generator.
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/common/gitignore.mustache b/modules/openapi-generator/src/main/resources/java-helidon/common/gitignore.mustache
new file mode 100644
index 00000000000..a530464afa1
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/common/gitignore.mustache
@@ -0,0 +1,21 @@
+*.class
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# exclude jar for gradle wrapper
+!gradle/wrapper/*.jar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+# build files
+**/target
+target
+.gradle
+build
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/common/licenseInfo.mustache b/modules/openapi-generator/src/main/resources/java-helidon/common/licenseInfo.mustache
new file mode 100644
index 00000000000..be193d0c4fe
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/common/licenseInfo.mustache
@@ -0,0 +1,11 @@
+/**
+ * {{{appName}}}
+ * {{{appDescription}}}
+ *
+ * {{#version}}The version of the OpenAPI document: {{{.}}}{{/version}}
+ * {{#infoEmail}}Contact: {{{.}}}{{/infoEmail}}
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/common/model.mustache b/modules/openapi-generator/src/main/resources/java-helidon/common/model.mustache
new file mode 100644
index 00000000000..00a3c3db131
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/common/model.mustache
@@ -0,0 +1,23 @@
+{{>licenseInfo}}
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+{{#serializableModel}}
+import java.io.Serializable;
+{{/serializableModel}}
+{{#useBeanValidation}}
+import {{rootJavaEEPackage}}.validation.constraints.*;
+import {{rootJavaEEPackage}}.validation.Valid;
+{{/useBeanValidation}}
+
+{{#models}}
+{{#model}}
+{{#isEnum}}
+{{>enumOuterClass}}
+{{/isEnum}}
+{{^isEnum}}
+{{>pojo}}
+{{/isEnum}}
+{{/model}}
+{{/models}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/common/pojo.mustache b/modules/openapi-generator/src/main/resources/java-helidon/common/pojo.mustache
new file mode 100644
index 00000000000..944ae482956
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/common/pojo.mustache
@@ -0,0 +1,121 @@
+{{#jsonb}}
+import java.lang.reflect.Type;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeDeserializer;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.DeserializationContext;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbDeserializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.SerializationContext;
+import {{rootJavaEEPackage}}.json.stream.JsonGenerator;
+import {{rootJavaEEPackage}}.json.stream.JsonParser;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbProperty;
+{{#vendorExtensions.x-has-readonly-properties}}
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbCreator;
+{{/vendorExtensions.x-has-readonly-properties}}
+{{/jsonb}}
+
+{{#description}}
+/**
+ * {{{.}}}
+ */{{/description}}
+public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}} {{#vendorExtensions.x-implements}}{{#-first}}implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
+
+{{#vars}}
+ {{#isEnum}}
+
+ {{^isContainer}}
+{{>enumClass}}
+ {{/isContainer}}
+ {{#isContainer}}
+ {{#mostInnerItems}}
+{{>enumClass}}
+ {{/mostInnerItems}}
+ {{/isContainer}}
+
+ {{/isEnum}}
+ private {{{datatypeWithEnum}}} {{{name}}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};
+{{/vars}}
+
+ /**
+ * Default constructor.
+ */
+ public {{classname}}() {
+ // JSON-B / Jackson
+ }
+
+ /**
+ * Create {{classname}}.
+ *
+{{#vars}}
+ * @param {{name}} {{description}}{{^description}}{{name}}{{/description}}
+{{/vars}}
+ */
+ public {{classname}}(
+{{#vars}}
+ {{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}
+{{/vars}}
+ ) {
+{{#vars}}
+ this.{{name}} = {{name}};
+{{/vars}}
+ }
+
+{{#vars}}{{#vendorExtensions.x-has-readonly-properties}}{{#jsonb}}
+ @JsonbCreator
+ public {{classname}}(
+ {{#readOnlyVars}}
+ @JsonbProperty("{{baseName}}") {{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}
+ {{/readOnlyVars}}
+ ) {
+ {{#readOnlyVars}}
+ this.{{name}} = {{name}};
+ {{/readOnlyVars}}
+ }{{/jsonb}}{{/vendorExtensions.x-has-readonly-properties}}
+
+ /**
+ {{#description}}
+ * {{{.}}}
+ {{/description}}
+ {{^description}}
+ * Get {{name}}
+ {{/description}}
+ {{#minimum}}
+ * minimum: {{.}}
+ {{/minimum}}
+ {{#maximum}}
+ * maximum: {{.}}
+ {{/maximum}}
+ * @return {{name}}
+ */
+ public {{{datatypeWithEnum}}} {{getter}}() {
+ return {{name}};
+ }
+
+ public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {
+ this.{{name}} = {{name}};
+ }{{/vars}}
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class {{classname}} {\n");
+ {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}}
+ {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n");
+ {{/vars}}sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/README.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/README.mustache
new file mode 100644
index 00000000000..81d0db100a7
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/README.mustache
@@ -0,0 +1,34 @@
+# Helidon Server with OpenAPI
+
+## Build and run
+
+With JDK11+
+```bash
+mvn package
+java -jar target/{{{artifactId}}}.jar
+```
+
+## Exercise the application
+
+```
+{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}curl -X {{httpMethod}} {{{basePath}}}{{{path}}}
+{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}
+```
+
+## Try health and metrics
+
+```
+curl -s -X GET {{{basePath}}}/health
+{"outcome":"UP",...
+. . .
+
+# Prometheus Format
+curl -s -X GET {{{basePath}}}/metrics
+# TYPE base:gc_g1_young_generation_count gauge
+. . .
+
+# JSON Format
+curl -H 'Accept: application/json' -X GET {{{basePath}}}/metrics
+{"base":...
+. . .
+```
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/RFC3339DateFormat.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/RFC3339DateFormat.mustache
new file mode 100644
index 00000000000..0f7f49e8618
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/RFC3339DateFormat.mustache
@@ -0,0 +1,39 @@
+{{>licenseInfo}}
+package {{invokerPackage}};
+
+import com.fasterxml.jackson.databind.util.StdDateFormat;
+
+import java.text.DateFormat;
+import java.text.FieldPosition;
+import java.text.ParsePosition;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+public class RFC3339DateFormat extends DateFormat {
+ private static final long serialVersionUID = 1L;
+ private static final TimeZone TIMEZONE_Z = TimeZone.getTimeZone("UTC");
+
+ private final StdDateFormat fmt = new StdDateFormat()
+ .withTimeZone(TIMEZONE_Z)
+ .withColonInTimeZone(true);
+
+ public RFC3339DateFormat() {
+ this.calendar = new GregorianCalendar();
+ }
+
+ @Override
+ public Date parse(String source, ParsePosition pos) {
+ return fmt.parse(source, pos);
+ }
+
+ @Override
+ public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
+ return fmt.format(date, toAppendTo, fieldPosition);
+ }
+
+ @Override
+ public Object clone() {
+ return this;
+ }
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/JavaTimeFormatter.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/JavaTimeFormatter.mustache
new file mode 100644
index 00000000000..f3fb34e559c
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/JavaTimeFormatter.mustache
@@ -0,0 +1,53 @@
+{{>licenseInfo}}
+package {{invokerPackage}};
+
+import java.time.OffsetDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+
+/**
+ * Class that add parsing/formatting support for Java 8+ {@code OffsetDateTime} class.
+ * It's generated for java clients when {@code AbstractJavaCodegen#dateLibrary} specified as {@code java8}.
+ */
+{{>generatedAnnotation}}
+public class JavaTimeFormatter {
+
+ private DateTimeFormatter offsetDateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
+
+ /**
+ * Get the date format used to parse/format {@code OffsetDateTime} parameters.
+ * @return DateTimeFormatter
+ */
+ public DateTimeFormatter getOffsetDateTimeFormatter() {
+ return offsetDateTimeFormatter;
+ }
+
+ /**
+ * Set the date format used to parse/format {@code OffsetDateTime} parameters.
+ * @param offsetDateTimeFormatter {@code DateTimeFormatter}
+ */
+ public void setOffsetDateTimeFormatter(DateTimeFormatter offsetDateTimeFormatter) {
+ this.offsetDateTimeFormatter = offsetDateTimeFormatter;
+ }
+
+ /**
+ * Parse the given string into {@code OffsetDateTime} object.
+ * @param str String
+ * @return {@code OffsetDateTime}
+ */
+ public OffsetDateTime parseOffsetDateTime(String str) {
+ try {
+ return OffsetDateTime.parse(str, offsetDateTimeFormatter);
+ } catch (DateTimeParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ /**
+ * Format the given {@code OffsetDateTime} object into string.
+ * @param offsetDateTime {@code OffsetDateTime}
+ * @return {@code OffsetDateTime} in string format
+ */
+ public String formatOffsetDateTime(OffsetDateTime offsetDateTime) {
+ return offsetDateTimeFormatter.format(offsetDateTime);
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/RestApplication.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/RestApplication.mustache
new file mode 100644
index 00000000000..341f5e4751b
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/RestApplication.mustache
@@ -0,0 +1,11 @@
+package {{invokerPackage}};
+
+import {{rootJavaEEPackage}}.enterprise.context.ApplicationScoped;
+import {{rootJavaEEPackage}}.ws.rs.ApplicationPath;
+import {{rootJavaEEPackage}}.ws.rs.core.Application;
+
+@ApplicationScoped
+@ApplicationPath("{{{contextPath}}}")
+public class RestApplication extends Application {
+
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/StringUtil.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/StringUtil.mustache
new file mode 100644
index 00000000000..e3d5d6e9088
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/StringUtil.mustache
@@ -0,0 +1,72 @@
+{{>licenseInfo}}
+
+package {{invokerPackage}};
+
+import java.util.Collection;
+import java.util.Iterator;
+
+{{>generatedAnnotation}}
+public class StringUtil {
+ /**
+ * Check if the given array contains the given value (with case-insensitive comparison).
+ *
+ * @param array The array
+ * @param value The value to search
+ * @return true if the array contains the value
+ */
+ public static boolean containsIgnoreCase(String[] array, String value) {
+ for (String str : array) {
+ if (value == null && str == null) {
+ return true;
+ }
+ if (value != null && value.equalsIgnoreCase(str)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Join an array of strings with the given separator.
+ *
+ * Note: This might be replaced by utility method from commons-lang or guava someday
+ * if one of those libraries is added as dependency.
+ *
+ *
+ * @param array The array of strings
+ * @param separator The separator
+ * @return the resulting string
+ */
+ public static String join(String[] array, String separator) {
+ int len = array.length;
+ if (len == 0) {
+ return "";
+ }
+
+ StringBuilder out = new StringBuilder();
+ out.append(array[0]);
+ for (int i = 1; i < len; i++) {
+ out.append(separator).append(array[i]);
+ }
+ return out.toString();
+ }
+
+ /**
+ * Join a list of strings with the given separator.
+ *
+ * @param list The list of strings
+ * @param separator The separator
+ * @return the resulting string
+ */
+ public static String join(Collection list, String separator) {
+ Iterator iterator = list.iterator();
+ StringBuilder out = new StringBuilder();
+ if (iterator.hasNext()) {
+ out.append(iterator.next());
+ }
+ while (iterator.hasNext()) {
+ out.append(separator).append(iterator.next());
+ }
+ return out.toString();
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/additionalEnumTypeAnnotations.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/additionalEnumTypeAnnotations.mustache
new file mode 100644
index 00000000000..aa524798b42
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/additionalEnumTypeAnnotations.mustache
@@ -0,0 +1,2 @@
+{{#additionalEnumTypeAnnotations}}{{{.}}}
+{{/additionalEnumTypeAnnotations}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/additionalModelTypeAnnotations.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/additionalModelTypeAnnotations.mustache
new file mode 100644
index 00000000000..f4871c02cc2
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/additionalModelTypeAnnotations.mustache
@@ -0,0 +1,2 @@
+{{#additionalModelTypeAnnotations}}{{{.}}}
+{{/additionalModelTypeAnnotations}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api.mustache
new file mode 100644
index 00000000000..495b0cc7599
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api.mustache
@@ -0,0 +1,33 @@
+{{>licenseInfo}}
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+
+import {{rootJavaEEPackage}}.ws.rs.*;
+{{#returnResponse}}
+import {{rootJavaEEPackage}}.ws.rs.core.Response;
+{{/returnResponse}}
+{{#supportAsync}}
+import java.util.concurrent.CompletionStage;
+import java.util.concurrent.CompletableFuture;
+{{/supportAsync}}
+
+import java.io.InputStream;
+import java.util.Map;
+import java.util.List;
+{{#useBeanValidation}}import {{rootJavaEEPackage}}.validation.constraints.*;
+import {{rootJavaEEPackage}}.validation.Valid;{{/useBeanValidation}}
+
+@Path("{{commonPath}}"){{#hasConsumes}}
+@Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }){{/hasConsumes}}{{#hasProduces}}
+@Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}}
+{{>generatedAnnotation}}
+public {{^useAbstractClass}}interface{{/useAbstractClass}}{{#useAbstractClass}}abstract class{{/useAbstractClass}} {{classname}} {
+{{#operations}}
+{{#operation}}
+
+{{>apiAbstract}}
+{{/operation}}
+}
+{{/operations}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/apiAbstract.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/apiAbstract.mustache
new file mode 100644
index 00000000000..a2d82121b02
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/apiAbstract.mustache
@@ -0,0 +1,5 @@
+ @{{httpMethod}}{{#subresourceOperation}}
+ @Path("{{{path}}}"){{/subresourceOperation}}{{#hasConsumes}}
+ @Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }){{/hasConsumes}}{{#hasProduces}}
+ @Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}}
+ {{#useAbstractClass}}abstract {{/useAbstractClass}}{{#supportAsync}}{{>returnAsyncTypeInterface}}{{/supportAsync}}{{^supportAsync}}{{>returnTypes}}{{/supportAsync}} {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>cookieParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{^-last}}, {{/-last}}{{/allParams}});
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/apiImpl.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/apiImpl.mustache
new file mode 100644
index 00000000000..9c9db82b249
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/apiImpl.mustache
@@ -0,0 +1,34 @@
+{{>licenseInfo}}
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+
+import {{rootJavaEEPackage}}.ws.rs.*;
+{{#returnResponse}}
+import {{rootJavaEEPackage}}.ws.rs.core.Response;
+{{/returnResponse}}
+
+{{#supportAsync}}
+import java.util.concurrent.CompletionStage;
+import java.util.concurrent.CompletableFuture;
+{{/supportAsync}}
+
+import java.io.InputStream;
+import java.util.Map;
+import java.util.List;
+{{#useBeanValidation}}import {{rootJavaEEPackage}}.validation.constraints.*;
+import {{rootJavaEEPackage}}.validation.Valid;{{/useBeanValidation}}
+
+@Path("{{commonPath}}"){{#hasConsumes}}
+@Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }){{/hasConsumes}}{{#hasProduces}}
+@Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}}
+{{>generatedAnnotation}}
+public class {{classname}}Impl {{^useAbstractClass}}implements{{/useAbstractClass}}{{#useAbstractClass}}extends{{/useAbstractClass}} {{classname}} {
+{{#operations}}
+{{#operation}}
+
+{{>apiMethod}}
+{{/operation}}
+}
+{{/operations}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/apiMethod.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/apiMethod.mustache
new file mode 100644
index 00000000000..b1c07572f6c
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/apiMethod.mustache
@@ -0,0 +1,22 @@
+ @{{httpMethod}}{{#subresourceOperation}}
+ @Path("{{{path}}}"){{/subresourceOperation}}{{#hasConsumes}}
+ @Consumes({ {{#consumes}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/consumes}} }){{/hasConsumes}}{{#hasProduces}}
+ @Produces({ {{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}} }){{/hasProduces}}
+ public {{#supportAsync}}{{>returnAsyncTypeInterface}}{{/supportAsync}}{{^supportAsync}}{{>returnTypes}}{{/supportAsync}} {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>cookieParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{^-last}},{{/-last}}{{/allParams}}) {
+ {{#returnResponse}}
+ return {{#supportAsync}}CompletableFuture.supplyAsync(() -> {{/supportAsync}}Response.ok({{#vendorExtensions.x-helidon-hasReturnType}}/* Pass {{{returnType}}} entity payload */{{/vendorExtensions.x-helidon-hasReturnType}}).build(){{#supportAsync}}){{/supportAsync}}; // Replace with correct business logic.
+ {{/returnResponse}}
+ {{^returnResponse}}
+ {{#vendorExtensions.x-helidon-hasReturnType}}
+ {{{returnType}}} result = {{{vendorExtensions.x-helidon-exampleReturnTypeValue}}}; // Replace with correct business logic.
+ {{/vendorExtensions.x-helidon-hasReturnType}}
+ {{#supportAsync}}
+ return CompletableFuture.supplyAsync(() -> {{#vendorExtensions.x-helidon-hasReturnType}}result{{/vendorExtensions.x-helidon-hasReturnType}}{{^vendorExtensions.x-helidon-hasReturnType}}null{{/vendorExtensions.x-helidon-hasReturnType}});
+ {{/supportAsync}}
+ {{^supportAsync}}
+ {{#vendorExtensions.x-helidon-hasReturnType}}
+ return result;
+ {{/vendorExtensions.x-helidon-hasReturnType}}
+ {{/supportAsync}}
+ {{/returnResponse}}
+ }
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_doc.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_doc.mustache
new file mode 100644
index 00000000000..3d3203957e6
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_doc.mustache
@@ -0,0 +1,108 @@
+# {{classname}}{{#description}}
+
+{{.}}{{/description}}
+
+All URIs are relative to *{{basePath}}*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+{{#operations}}{{#operation}}| [**{{operationId}}**]({{classname}}.md#{{operationId}}) | **{{httpMethod}}** {{commonPath}}{{path}} | {{summary}} |
+{{/operation}}{{/operations}}
+
+{{#operations}}
+{{#operation}}
+
+## {{operationId}}
+
+> {{#returnType}}{{.}} {{/returnType}}{{operationId}}({{#allParams}}{{{paramName}}}{{^-last}}, {{/-last}}{{/allParams}})
+
+{{summary}}{{#notes}}
+
+{{.}}{{/notes}}
+
+### Example
+
+```java
+// Import classes:
+import {{{invokerPackage}}}.ApiClient;
+import {{{invokerPackage}}}.ApiException;
+import {{{invokerPackage}}}.Configuration;{{#hasAuthMethods}}
+import {{{invokerPackage}}}.auth.*;{{/hasAuthMethods}}
+import {{{invokerPackage}}}.models.*;
+import {{{package}}}.{{{classname}}};
+
+public class Example {
+ public static void main(String[] args) {
+ ApiClient defaultClient = Configuration.getDefaultApiClient();
+ defaultClient.setBasePath("{{{basePath}}}");
+ {{#hasAuthMethods}}
+ {{#authMethods}}{{#isBasic}}{{#isBasicBasic}}
+ // Configure HTTP basic authorization: {{{name}}}
+ HttpBasicAuth {{{name}}} = (HttpBasicAuth) defaultClient.getAuthentication("{{{name}}}");
+ {{{name}}}.setUsername("YOUR USERNAME");
+ {{{name}}}.setPassword("YOUR PASSWORD");{{/isBasicBasic}}{{#isBasicBearer}}
+ // Configure HTTP bearer authorization: {{{name}}}
+ HttpBearerAuth {{{name}}} = (HttpBearerAuth) defaultClient.getAuthentication("{{{name}}}");
+ {{{name}}}.setBearerToken("BEARER TOKEN");{{/isBasicBearer}}{{/isBasic}}{{#isApiKey}}
+ // Configure API key authorization: {{{name}}}
+ ApiKeyAuth {{{name}}} = (ApiKeyAuth) defaultClient.getAuthentication("{{{name}}}");
+ {{{name}}}.setApiKey("YOUR API KEY");
+ // Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
+ //{{{name}}}.setApiKeyPrefix("Token");{{/isApiKey}}{{#isOAuth}}
+ // Configure OAuth2 access token for authorization: {{{name}}}
+ OAuth {{{name}}} = (OAuth) defaultClient.getAuthentication("{{{name}}}");
+ {{{name}}}.setAccessToken("YOUR ACCESS TOKEN");{{/isOAuth}}
+ {{/authMethods}}
+ {{/hasAuthMethods}}
+
+ {{{classname}}} apiInstance = new {{{classname}}}(defaultClient);
+ {{#allParams}}
+ {{{dataType}}} {{{paramName}}} = {{{example}}}; // {{{dataType}}} | {{{description}}}
+ {{/allParams}}
+ try {
+ {{#returnType}}{{{.}}} result = {{/returnType}}apiInstance.{{{operationId}}}({{#allParams}}{{{paramName}}}{{^-last}}, {{/-last}}{{/allParams}});{{#returnType}}
+ System.out.println(result);{{/returnType}}
+ } catch (ApiException e) {
+ System.err.println("Exception when calling {{{classname}}}#{{{operationId}}}");
+ System.err.println("Status code: " + e.getCode());
+ System.err.println("Reason: " + e.getResponseBody());
+ System.err.println("Response headers: " + e.getResponseHeaders());
+ e.printStackTrace();
+ }
+ }
+}
+```
+
+### Parameters
+
+{{^allParams}}This endpoint does not need any parameter.{{/allParams}}{{#allParams}}{{#-last}}
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|{{/-last}}{{/allParams}}
+{{#allParams}}| **{{paramName}}** | {{#isPrimitiveType}}**{{dataType}}**{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isFile}}**{{dataType}}**{{/isFile}}{{^isFile}}[**{{dataType}}**]({{baseType}}.md){{/isFile}}{{/isPrimitiveType}}| {{description}} |{{^required}} [optional]{{/required}}{{^isContainer}}{{#defaultValue}} [default to {{.}}]{{/defaultValue}}{{/isContainer}}{{#allowableValues}} [enum: {{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}]{{/allowableValues}} |
+{{/allParams}}
+
+### Return type
+
+{{#returnType}}{{#returnTypeIsPrimitive}}**{{returnType}}**{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}}[**{{returnType}}**]({{returnBaseType}}.md){{/returnTypeIsPrimitive}}{{/returnType}}{{^returnType}}null (empty response body){{/returnType}}
+
+### Authorization
+
+{{^authMethods}}No authorization required{{/authMethods}}{{#authMethods}}[{{name}}](../README.md#{{name}}){{^-last}}, {{/-last}}{{/authMethods}}
+
+### HTTP request headers
+
+- **Content-Type**: {{#consumes}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/consumes}}{{^consumes}}Not defined{{/consumes}}
+- **Accept**: {{#produces}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/produces}}{{^produces}}Not defined{{/produces}}
+
+{{#responses.0}}
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+{{#responses}}
+| **{{code}}** | {{message}} | {{#headers}} * {{baseName}} - {{description}}
{{/headers}}{{^headers.0}} - {{/headers.0}} |
+{{/responses}}
+{{/responses.0}}
+
+{{/operation}}
+{{/operations}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_exception.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_exception.mustache
new file mode 100644
index 00000000000..d9fb5ee91d8
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_exception.mustache
@@ -0,0 +1,19 @@
+{{>licenseInfo}}
+package {{apiPackage}};
+
+import {{rootJavaEEPackage}}.ws.rs.core.Response;
+
+public class ApiException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ private final Response response;
+
+ public ApiException(Response response) {
+ super("Api response has status code " + response.getStatus());
+ this.response = response;
+ }
+
+ public Response getResponse() {
+ return this.response;
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_exception_mapper.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_exception_mapper.mustache
new file mode 100644
index 00000000000..ac4db62e8b8
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_exception_mapper.mustache
@@ -0,0 +1,22 @@
+{{>licenseInfo}}
+package {{apiPackage}};
+
+import {{rootJavaEEPackage}}.ws.rs.core.MultivaluedMap;
+import {{rootJavaEEPackage}}.ws.rs.core.Response;
+import {{rootJavaEEPackage}}.ws.rs.ext.Provider;
+
+import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper;
+
+@Provider
+public class ApiExceptionMapper implements ResponseExceptionMapper {
+
+ @Override
+ public boolean handles(int status, MultivaluedMap headers) {
+ return status >= 400;
+ }
+
+ @Override
+ public ApiException toThrowable(Response response) {
+ return new ApiException(response);
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_test.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_test.mustache
new file mode 100644
index 00000000000..431834b779b
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/api_test.mustache
@@ -0,0 +1,59 @@
+{{>licenseInfo}}
+
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+import {{rootJavaEEPackage}}.inject.Inject;
+import {{rootJavaEEPackage}}.ws.rs.client.WebTarget;
+
+import org.junit.jupiter.api.Test;
+
+import io.helidon.microprofile.tests.junit5.HelidonTest;
+
+import java.net.URL;
+import java.net.MalformedURLException;
+{{^fullJavaUtil}}
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+{{/fullJavaUtil}}
+
+/**
+ {{#appName}}
+ * {{{.}}} Test
+ *
+ {{/appName}}
+ * API tests for {{classname}}
+ */
+@HelidonTest
+public class {{classname}}Test {
+
+ @Inject
+ private WebTarget target;
+
+ {{#operations}}{{#operation}}
+ /**
+ {{#summary}}
+ * {{summary}}
+ *
+ {{#notes}}
+ * {{.}}
+ *
+ {{/notes}}
+ {{/summary}}
+ * @throws ApiException if the Api call fails
+ */
+ @Test
+ public void {{operationId}}Test() throws Exception {
+ // TODO: test validations
+ {{#allParams}}
+ {{^isFile}}{{{dataType}}} {{paramName}} = null;{{/isFile}}
+ {{/allParams}}
+ //{{#returnType}}{{{.}}} response = {{/returnType}}target.{{operationId}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
+ //{{#returnType}}assertNotNull(response);{{/returnType}}
+ }
+ {{/operation}}{{/operations}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidatedType.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidatedType.mustache
new file mode 100644
index 00000000000..8f2816b2c70
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidatedType.mustache
@@ -0,0 +1 @@
+{{#isArray}}{{baseType}}<{{#items}}{{#useBeanValidation}}{{>beanValidation}}{{/useBeanValidation}}{{>beanValidatedType}}{{/items}}>{{/isArray}}{{^isArray}}{{{datatypeWithEnum}}}{{/isArray}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidation.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidation.mustache
new file mode 100644
index 00000000000..c8c6946fef6
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidation.mustache
@@ -0,0 +1,4 @@
+{{#required}}
+ @NotNull
+{{/required}}
+{{>beanValidationCore}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationCore.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationCore.mustache
new file mode 100644
index 00000000000..d6e2f13b457
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationCore.mustache
@@ -0,0 +1,20 @@
+{{#pattern}} @Pattern(regexp="{{{.}}}"){{/pattern}}{{!
+minLength && maxLength set
+}}{{#minLength}}{{#maxLength}} @Size(min={{minLength}},max={{maxLength}}){{/maxLength}}{{/minLength}}{{!
+minLength set, maxLength not
+}}{{#minLength}}{{^maxLength}} @Size(min={{minLength}}){{/maxLength}}{{/minLength}}{{!
+minLength not set, maxLength set
+}}{{^minLength}}{{#maxLength}} @Size(max={{.}}){{/maxLength}}{{/minLength}}{{!
+@Size: minItems && maxItems set
+}}{{#minItems}}{{#maxItems}} @Size(min={{minItems}},max={{maxItems}}){{/maxItems}}{{/minItems}}{{!
+@Size: minItems set, maxItems not
+}}{{#minItems}}{{^maxItems}} @Size(min={{minItems}}){{/maxItems}}{{/minItems}}{{!
+@Size: minItems not set && maxItems set
+}}{{^minItems}}{{#maxItems}} @Size(max={{.}}){{/maxItems}}{{/minItems}}{{!
+check for integer or long / all others=decimal type with @Decimal*
+isInteger set
+}}{{#isInteger}}{{#minimum}} @Min({{.}}){{/minimum}}{{#maximum}} @Max({{.}}){{/maximum}}{{/isInteger}}{{!
+isLong set
+}}{{#isLong}}{{#minimum}} @Min({{.}}L){{/minimum}}{{#maximum}} @Max({{.}}L){{/maximum}}{{/isLong}}{{!
+Not Integer, not Long => we have a decimal value!
+}}{{^isInteger}}{{^isLong}}{{#minimum}} @DecimalMin({{#exclusiveMinimum}}value={{/exclusiveMinimum}}"{{minimum}}"{{#exclusiveMinimum}},inclusive=false{{/exclusiveMinimum}}){{/minimum}}{{#maximum}} @DecimalMax({{#exclusiveMaximum}}value={{/exclusiveMaximum}}"{{maximum}}"{{#exclusiveMaximum}},inclusive=false{{/exclusiveMaximum}}){{/maximum}}{{/isLong}}{{/isInteger}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationHeaderParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationHeaderParams.mustache
new file mode 100644
index 00000000000..c4ff01d7e55
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationHeaderParams.mustache
@@ -0,0 +1 @@
+{{#required}} @NotNull{{/required}}{{>beanValidationCore}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationPathParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationPathParams.mustache
new file mode 100644
index 00000000000..051bd53c0a5
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationPathParams.mustache
@@ -0,0 +1 @@
+{{! PathParam is always required, no @NotNull necessary }}{{>beanValidationCore}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationQueryParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationQueryParams.mustache
new file mode 100644
index 00000000000..c4ff01d7e55
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beanValidationQueryParams.mustache
@@ -0,0 +1 @@
+{{#required}} @NotNull{{/required}}{{>beanValidationCore}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beans.xml.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beans.xml.mustache
new file mode 100644
index 00000000000..125ef995e5e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/beans.xml.mustache
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/bodyParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/bodyParams.mustache
new file mode 100644
index 00000000000..f938cb5b6be
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/bodyParams.mustache
@@ -0,0 +1 @@
+{{#isBodyParam}}{{#useBeanValidation}}@Valid {{#required}}{{^isNullable}}@NotNull {{/isNullable}}{{/required}}{{/useBeanValidation}}{{{dataType}}} {{paramName}}{{/isBodyParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/build.gradle.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/build.gradle.mustache
new file mode 100644
index 00000000000..4de685654d4
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/build.gradle.mustache
@@ -0,0 +1,79 @@
+plugins {
+ id 'java'
+ id 'application'
+}
+
+group = '{{{groupId}}}'
+version = '{{{artifactVersion}}}'
+
+{{#appDescription}}
+description = """{{.}}"""
+{{/appDescription}}
+
+
+sourceCompatibility = 11
+targetCompatibility = 11
+
+tasks.withType(JavaCompile) {
+ options.encoding = 'UTF-8'
+}
+
+ext {
+ helidonVersion = '{{{helidonVersion}}}'
+ mainClass='io.helidon.microprofile.cdi.Main'
+}
+
+test {
+ useJUnitPlatform()
+}
+
+repositories {
+ mavenCentral()
+ mavenLocal()
+}
+
+dependencies {
+ // import Helidon BOM
+ implementation enforcedPlatform("io.helidon:helidon-dependencies:${project.helidonVersion}")
+ implementation 'io.helidon.microprofile.bundles:helidon-microprofile-core'
+ implementation 'io.helidon.microprofile.cdi:helidon-microprofile-cdi'
+ implementation '{{rootJavaEEPackage}}.enterprise:{{rootJavaEEPackage}}.enterprise.cdi-api'
+ implementation '{{rootJavaEEPackage}}.ws.rs:{{rootJavaEEPackage}}.ws.rs-api'
+{{#jackson}}
+ implementation 'org.glassfish.jersey.media:jersey-media-json-jackson'
+{{/jackson}}
+{{#jsonb}}
+ implementation 'org.glassfish.jersey.media:jersey-media-json-binding'
+ implementation '{{rootJavaEEPackage}}.json.bind:{{rootJavaEEPackage}}.json.bind-api'
+{{/jsonb}}
+ testImplementation 'junit:junit'
+ testImplementation 'io.helidon.microprofile.tests:helidon-microprofile-tests-junit5'
+}
+
+// define a custom task to copy all dependencies in the runtime classpath
+// into build/libs/libs
+// uses built-in Copy
+task copyLibs(type: Copy) {
+ from configurations.runtimeClasspath
+ into 'build/libs/libs'
+}
+
+// add it as a dependency of built-in task 'assemble'
+copyLibs.dependsOn jar
+assemble.dependsOn copyLibs
+
+// default jar configuration
+// set the main classpath
+// add each jar under build/libs/libs into the classpath
+jar {
+ archiveFileName = "${project.name}.jar"
+ manifest {
+ attributes ('Main-Class': "${project.mainClass}",
+ 'Class-Path': configurations.runtimeClasspath.files.collect { "libs/$it.name" }.join(' ')
+ )
+ }
+}
+
+application {
+mainClass = "${project.mainClass}"
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/cookieParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/cookieParams.mustache
new file mode 100644
index 00000000000..3aa861dd0ff
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/cookieParams.mustache
@@ -0,0 +1 @@
+{{#isCookieParam}}@CookieParam("{{baseName}}"){{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{^isContainer}}{{#defaultValue}} @DefaultValue("{{{.}}}"){{/defaultValue}}{{/isContainer}} {{{dataType}}} {{paramName}}{{/isCookieParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/enumClass.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/enumClass.mustache
new file mode 100644
index 00000000000..441eab35340
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/enumClass.mustache
@@ -0,0 +1,48 @@
+{{>additionalEnumTypeAnnotations}}public enum {{datatypeWithEnum}} {
+
+ {{#allowableValues}}
+ {{#enumVars}}{{name}}({{dataType}}.valueOf({{{value}}})){{^-last}}, {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}
+ {{/allowableValues}}
+
+
+ private {{dataType}} value;
+
+ {{datatypeWithEnum}} ({{dataType}} v) {
+ value = v;
+ }
+
+ public {{dataType}} value() {
+ return value;
+ }
+
+ @Override
+ {{#jackson}}@JsonValue{{/jackson}}
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ /**
+ * Convert a String into {{dataType}}, as specified in the
+ * See JAX RS 2.0 Specification, section 3.2, p. 12
+ */
+ public static {{datatypeWithEnum}} fromString(String s) {
+ for ({{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ // using Objects.toString() to be safe if value type non-object type
+ // because types like 'int' etc. will be auto-boxed
+ if (java.util.Objects.toString(b.value).equals(s)) {
+ return b;
+ }
+ }
+ {{#isNullable}}return null;{{/isNullable}}{{^isNullable}}throw new IllegalArgumentException("Unexpected string value '" + s + "'");{{/isNullable}}
+ }
+
+ {{#jackson}}@JsonCreator{{/jackson}}
+ public static {{datatypeWithEnum}} fromValue({{dataType}} value) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ {{#isNullable}}return null;{{/isNullable}}{{^isNullable}}throw new IllegalArgumentException("Unexpected value '" + value + "'");{{/isNullable}}
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/enumOuterClass.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/enumOuterClass.mustache
new file mode 100644
index 00000000000..3d9a35ead90
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/enumOuterClass.mustache
@@ -0,0 +1,61 @@
+{{#jackson}}
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+{{/jackson}}
+{{#jsonb}}
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbCreator;
+{{/jsonb}}
+
+/**
+ * {{description}}{{^description}}Gets or Sets {{{name}}}{{/description}}
+ */
+{{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} {
+ {{#gson}}
+ {{#allowableValues}}{{#enumVars}}
+ @SerializedName({{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}}{{{value}}}{{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}})
+ {{{name}}}({{{value}}}){{^-last}},
+ {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}}
+ {{/gson}}
+ {{^gson}}
+ {{#allowableValues}}{{#enumVars}}
+ {{{name}}}({{{value}}}){{^-last}},
+ {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}}
+ {{/gson}}
+
+ private {{{dataType}}} value;
+
+ {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}({{{dataType}}} value) {
+ this.value = value;
+ }
+
+ /**
+ * Convert a String into {{dataType}}, as specified in the
+ * See JAX RS 2.0 Specification, section 3.2, p. 12
+ */
+ public static {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromString(String s) {
+ for ({{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ // using Objects.toString() to be safe if value type non-object type
+ // because types like 'int' etc. will be auto-boxed
+ if (java.util.Objects.toString(b.value).equals(s)) {
+ return b;
+ }
+ }
+ {{#isNullable}}return null;{{/isNullable}}{{^isNullable}}throw new IllegalArgumentException("Unexpected string value '" + s + "'");{{/isNullable}}
+ }
+
+ @Override
+ {{#jackson}}@JsonValue{{/jackson}}
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ {{#jackson}}@JsonCreator{{/jackson}}{{#jsonb}}@JsonbCreator{{/jsonb}}
+ public static {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue({{{dataType}}} value) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ {{#isNullable}}return null;{{/isNullable}}{{^isNullable}}throw new IllegalArgumentException("Unexpected value '" + value + "'");{{/isNullable}}
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/formParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/formParams.mustache
new file mode 100644
index 00000000000..885966e6442
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/formParams.mustache
@@ -0,0 +1 @@
+{{#isFormParam}}{{^isFile}}@FormParam(value = "{{baseName}}") {{{dataType}}} {{paramName}}{{/isFile}}{{#isFile}} @FormParam(value = "{{baseName}}") InputStream {{paramName}}InputStream{{/isFile}}{{/isFormParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/generatedAnnotation.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/generatedAnnotation.mustache
new file mode 100644
index 00000000000..356a48872aa
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/generatedAnnotation.mustache
@@ -0,0 +1 @@
+@{{rootJavaEEPackage}}.annotation.Generated(value = "{{generatorClass}}"{{^hideGenerationTimestamp}}, date = "{{generatedDate}}"{{/hideGenerationTimestamp}})
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/headerParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/headerParams.mustache
new file mode 100644
index 00000000000..ef50692b026
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/headerParams.mustache
@@ -0,0 +1 @@
+{{#isHeaderParam}}@HeaderParam("{{baseName}}"){{#useBeanValidation}}{{>beanValidationHeaderParams}}{{/useBeanValidation}} {{#defaultValue}} @DefaultValue("{{{.}}}"){{/defaultValue}} {{{dataType}}} {{paramName}}{{/isHeaderParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/logging.properties.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/logging.properties.mustache
new file mode 100644
index 00000000000..3e909fb7d90
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/logging.properties.mustache
@@ -0,0 +1,25 @@
+# Example Logging Configuration File
+# For more information see $JAVA_HOME/jre/lib/logging.properties
+
+## Send messages to the console
+handlers=io.helidon.common.HelidonConsoleHandler
+#
+## HelidonConsoleHandler uses a SimpleFormatter subclass that replaces "!thread!" with the current thread
+java.util.logging.SimpleFormatter.format=%1$tY.%1$tm.%1$td %1$tH:%1$tM:%1$tS %4$s %3$s !thread!: %5$s%6$s%n
+#
+## Global logging level. Can be overridden by specific loggers
+.level=INFO
+
+# Quiet Weld
+org.jboss.level=WARNING
+
+#
+# Component specific log levels
+#io.helidon.webserver.level=INFO
+#io.helidon.config.level=INFO
+#io.helidon.security.level=INFO
+#io.helidon.microprofile.level=INFO
+#io.helidon.common.level=INFO
+#io.netty.level=INFO
+#org.glassfish.jersey.level=INFO
+#org.jboss.weld=INFO
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/microprofile-config.properties.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/microprofile-config.properties.mustache
new file mode 100644
index 00000000000..38988f20e5e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/microprofile-config.properties.mustache
@@ -0,0 +1,11 @@
+# Microprofile server properties
+
+# Application properties. This is the default greeting
+app.greeting=Hello
+
+# Microprofile server properties
+server.port=8080
+server.host=0.0.0.0
+
+# Enable the optional MicroProfile Metrics REST.request metrics
+metrics.rest-request.enabled=true
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/model.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/model.mustache
new file mode 100644
index 00000000000..00a3c3db131
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/model.mustache
@@ -0,0 +1,23 @@
+{{>licenseInfo}}
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+{{#serializableModel}}
+import java.io.Serializable;
+{{/serializableModel}}
+{{#useBeanValidation}}
+import {{rootJavaEEPackage}}.validation.constraints.*;
+import {{rootJavaEEPackage}}.validation.Valid;
+{{/useBeanValidation}}
+
+{{#models}}
+{{#model}}
+{{#isEnum}}
+{{>enumOuterClass}}
+{{/isEnum}}
+{{^isEnum}}
+{{>pojo}}
+{{/isEnum}}
+{{/model}}
+{{/models}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/modelEnum.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/modelEnum.mustache
new file mode 100644
index 00000000000..1eb5bb263c7
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/modelEnum.mustache
@@ -0,0 +1,73 @@
+ /**
+ * {{description}}{{^description}}Gets or Sets {{{name}}}{{/description}}
+ */
+{{#jsonb}}
+ @JsonbTypeSerializer({{datatypeWithEnum}}.Serializer.class)
+ @JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class)
+{{/jsonb}}
+{{#withXml}}
+ @XmlType(name="{{datatypeWithEnum}}")
+ @XmlEnum({{dataType}}.class)
+{{/withXml}}
+ {{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} {
+ {{#allowableValues}}
+ {{#enumVars}}
+ {{#enumDescription}}
+ /**
+ * {{.}}
+ */
+ {{/enumDescription}}
+ {{#withXml}}
+ @XmlEnumValue({{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}}{{{value}}}{{#isInteger}}"{{/isInteger}}{{#isDouble}}"{{/isDouble}}{{#isLong}}"{{/isLong}}{{#isFloat}}"{{/isFloat}})
+ {{/withXml}}
+ {{{name}}}({{{value}}}){{^-last}},
+ {{/-last}}{{#-last}};{{/-last}}
+ {{/enumVars}}
+ {{/allowableValues}}
+
+ private {{{dataType}}} value;
+
+ {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}({{{dataType}}} value) {
+ this.value = value;
+ }
+
+ {{#jackson}}@JsonValue{{/jackson}}
+ public {{{dataType}}} getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ {{#jackson}}@JsonCreator{{/jackson}}
+ public static {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue({{{dataType}}} value) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ {{#isNullable}}return null;{{/isNullable}}{{^isNullable}}throw new IllegalArgumentException("Unexpected value '" + value + "'");{{/isNullable}}
+ }
+{{#jsonb}}
+ public static final class Deserializer implements JsonbDeserializer<{{datatypeWithEnum}}> {
+ @Override
+ public {{datatypeWithEnum}} deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (String.valueOf(b.value).equals(parser.getString())) {
+ return b;
+ }
+ }
+ {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + parser.getString() + "'");{{/useNullForUnknownEnumValue}}
+ }
+ }
+
+ public static final class Serializer implements JsonbSerializer<{{datatypeWithEnum}}> {
+ @Override
+ public void serialize({{datatypeWithEnum}} obj, JsonGenerator generator, SerializationContext ctx) {
+ generator.write(obj.value);
+ }
+ }
+{{/jsonb}}
+ }
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/model_doc.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/model_doc.mustache
new file mode 100644
index 00000000000..9a7fe146a4e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/model_doc.mustache
@@ -0,0 +1,4 @@
+{{#models}}{{#model}}
+
+{{#isEnum}}{{>enum_outer_doc}}{{/isEnum}}{{^isEnum}}{{>pojo_doc}}{{/isEnum}}
+{{/model}}{{/models}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/openapi.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/openapi.mustache
new file mode 100644
index 00000000000..51ebafb0187
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/openapi.mustache
@@ -0,0 +1 @@
+{{{openapi-yaml}}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pathParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pathParams.mustache
new file mode 100644
index 00000000000..9e8455d5ac7
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pathParams.mustache
@@ -0,0 +1 @@
+{{#isPathParam}}@PathParam("{{baseName}}"){{#useBeanValidation}}{{>beanValidationPathParams}}{{/useBeanValidation}} {{{dataType}}} {{paramName}}{{/isPathParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pojo.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pojo.mustache
new file mode 100644
index 00000000000..8cb61daf3de
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pojo.mustache
@@ -0,0 +1,161 @@
+
+{{#jsonb}}
+import java.lang.reflect.Type;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeDeserializer;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.DeserializationContext;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbDeserializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.SerializationContext;
+import {{rootJavaEEPackage}}.json.stream.JsonGenerator;
+import {{rootJavaEEPackage}}.json.stream.JsonParser;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbProperty;
+{{#vendorExtensions.x-has-readonly-properties}}
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbCreator;
+{{/vendorExtensions.x-has-readonly-properties}}
+{{/jsonb}}
+{{#jackson}}
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonValue;
+{{/jackson}}
+
+{{#description}}
+/**
+ * {{{.}}}
+ **/
+{{/description}}
+{{>additionalModelTypeAnnotations}}
+{{#vendorExtensions.x-class-extra-annotation}}
+{{{vendorExtensions.x-class-extra-annotation}}}
+{{/vendorExtensions.x-class-extra-annotation}}
+public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}}{{#vendorExtensions.x-implements}}{{#-first}} implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
+ {{#vars}}{{#isEnum}}{{^isContainer}}
+{{>enumClass}}{{/isContainer}}{{#isContainer}}{{#mostInnerItems}}
+{{>enumClass}}{{/mostInnerItems}}{{/isContainer}}{{/isEnum}}
+{{#description}}
+ /**
+ * {{{.}}}
+ **/
+{{/description}}
+{{#vendorExtensions.x-field-extra-annotation}}
+{{{vendorExtensions.x-field-extra-annotation}}}
+{{/vendorExtensions.x-field-extra-annotation}}
+{{#isContainer}}
+ private {{{datatypeWithEnum}}} {{name}}{{#required}} = {{{defaultValue}}}{{/required}}{{^required}} = null{{/required}};
+{{/isContainer}}
+{{^isContainer}}
+ private {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};
+{{/isContainer}}
+ {{/vars}}
+{{#vendorExtensions.x-has-readonly-properties}}{{^withXml}}
+ public {{classname}}() {
+ }
+
+ {{#jsonb}}@JsonbCreator{{/jsonb}}{{#jackson}}@JsonCreator{{/jackson}}
+ public {{classname}}(
+ {{#readOnlyVars}}
+ {{#jsonb}}@JsonbProperty("{{baseName}}") {{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}{{/jsonb}}
+ {{#jackson}}@JsonProperty(value="{{baseName}}") {{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}{{/jackson}}
+ {{/readOnlyVars}}
+ ) {
+ {{#readOnlyVars}}
+ this.{{name}} = {{name}};
+ {{/readOnlyVars}}
+ }
+ {{/withXml}}{{/vendorExtensions.x-has-readonly-properties}}
+ {{#vars}}
+ /**
+ {{#description}}
+ * {{.}}
+ {{/description}}
+ {{^description}}
+ * Get {{name}}
+ {{/description}}
+ {{#minimum}}
+ * minimum: {{.}}
+ {{/minimum}}
+ {{#maximum}}
+ * maximum: {{.}}
+ {{/maximum}}
+ * @return {{name}}
+ {{#deprecated}}
+ * @deprecated
+ {{/deprecated}}
+ **/
+{{#deprecated}}
+ @Deprecated
+{{/deprecated}}
+{{#vendorExtensions.x-extra-annotation}}
+ {{{vendorExtensions.x-extra-annotation}}}
+{{/vendorExtensions.x-extra-annotation}}
+{{#useBeanValidation}}{{>beanValidation}}{{/useBeanValidation}} {{#withXml}}{{#isEnum}}{{^isArray}}{{^isMap}}public {{dataType}} {{getter}}() {
+ if ({{name}} == null) {
+ return null;
+ }
+ return {{name}}.value();
+ }{{/isMap}}{{/isArray}}{{/isEnum}}{{/withXml}}{{^withXml}}{{#isEnum}}{{^isArray}}{{^isMap}}public {{datatypeWithEnum}} {{getter}}() {
+ return {{name}};
+ }{{/isMap}}{{/isArray}}{{/isEnum}}{{/withXml}}{{#isEnum}}{{#isArray}}public {{{datatypeWithEnum}}} {{getter}}() {
+ return {{name}};
+ }{{/isArray}}{{/isEnum}}{{#isEnum}}{{#isMap}}public {{{datatypeWithEnum}}} {{getter}}() {
+ return {{name}};
+ }{{/isMap}}{{/isEnum}}{{^isEnum}}public {{{datatypeWithEnum}}} {{getter}}() {
+ return {{name}};
+ }{{/isEnum}}
+
+ {{^isReadOnly}}
+ /**
+ * Set {{name}}
+ **/
+ {{#vendorExtensions.x-setter-extra-annotation}} {{{vendorExtensions.x-setter-extra-annotation}}}
+ {{/vendorExtensions.x-setter-extra-annotation}}public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {
+ this.{{name}} = {{name}};
+ }
+
+ public {{classname}} {{name}}({{{datatypeWithEnum}}} {{name}}) {
+ this.{{name}} = {{name}};
+ return this;
+ }
+ {{#isArray}}
+
+ public {{classname}} add{{nameInCamelCase}}Item({{{items.datatypeWithEnum}}} {{name}}Item) {
+ this.{{name}}.add({{name}}Item);
+ return this;
+ }
+ {{/isArray}}
+ {{#isMap}}
+
+ public {{classname}} put{{nameInCamelCase}}Item(String key, {{{items.datatypeWithEnum}}} {{name}}Item) {
+ this.{{name}}.put(key, {{name}}Item);
+ return this;
+ }
+ {{/isMap}}
+ {{/isReadOnly}}
+
+ {{/vars}}
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class {{classname}} {\n");
+ {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}}
+ {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n");
+ {{/vars}}sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pojo_doc.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pojo_doc.mustache
new file mode 100644
index 00000000000..bae0bc48cdd
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pojo_doc.mustache
@@ -0,0 +1,37 @@
+# {{#vendorExtensions.x-is-one-of-interface}}Interface {{/vendorExtensions.x-is-one-of-interface}}{{classname}}
+
+{{#description}}{{&description}}
+{{/description}}
+{{^vendorExtensions.x-is-one-of-interface}}
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+{{#vars}}|**{{name}}** | {{#isEnum}}[**{{datatypeWithEnum}}**](#{{datatypeWithEnum}}){{/isEnum}}{{^isEnum}}{{#isContainer}}{{#isArray}}{{#items}}{{#isModel}}[{{/isModel}}{{/items}}**{{baseType}}{{#items}}<{{dataType}}>**{{#isModel}}]({{^baseType}}{{dataType}}{{/baseType}}{{baseType}}.md){{/isModel}}{{/items}}{{/isArray}}{{#isMap}}{{#items}}{{#isModel}}[{{/isModel}}**Map<String, {{dataType}}>**{{#isModel}}]({{^baseType}}{{dataType}}{{/baseType}}{{baseType}}.md){{/isModel}}{{/items}}{{/isMap}}{{/isContainer}}{{^isContainer}}{{#isModel}}[{{/isModel}}**{{dataType}}**{{#isModel}}]({{^baseType}}{{dataType}}{{/baseType}}{{baseType}}.md){{/isModel}}{{/isContainer}}{{/isEnum}} | {{description}} | {{^required}} [optional]{{/required}}{{#isReadOnly}} [readonly]{{/isReadOnly}} |
+{{/vars}}
+{{#vars}}{{#isEnum}}
+
+
+## Enum: {{datatypeWithEnum}}
+
+| Name | Value |
+|---- | -----|{{#allowableValues}}{{#enumVars}}
+| {{name}} | {{value}} |{{/enumVars}}{{/allowableValues}}
+{{/isEnum}}{{/vars}}
+{{#vendorExtensions.x-implements.0}}
+
+## Implemented Interfaces
+
+{{#vendorExtensions.x-implements}}
+* {{{.}}}
+{{/vendorExtensions.x-implements}}
+{{/vendorExtensions.x-implements.0}}
+{{/vendorExtensions.x-is-one-of-interface}}
+{{#vendorExtensions.x-is-one-of-interface}}
+## Implementing Classes
+
+{{#oneOf}}
+* {{{.}}}
+{{/oneOf}}
+{{/vendorExtensions.x-is-one-of-interface}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pom.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pom.mustache
new file mode 100644
index 00000000000..e58df32a5bc
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/pom.mustache
@@ -0,0 +1,100 @@
+
+ 4.0.0
+ {{groupId}}
+
+ io.helidon.applications
+ helidon-mp
+ {{{helidonVersion}}}
+
+
+ {{artifactId}}
+ {{artifactId}}
+ {{#appDescription}}
+ {{.}}
+ {{/appDescription}}
+ {{artifactVersion}}
+ jar
+
+{{#openApiNullable}}
+
+ 0.2.3
+
+{{/openApiNullable}}
+
+
+
+ io.helidon.microprofile.bundles
+ helidon-microprofile-core
+
+
+ io.helidon.microprofile.cdi
+ helidon-microprofile-cdi
+
+
+ {{x-helidon-rootJavaEEDepPrefix}}.enterprise
+ {{x-helidon-rootJavaEEDepPrefix}}.enterprise.cdi-api
+
+
+ {{x-helidon-rootJavaEEDepPrefix}}.ws.rs
+ {{x-helidon-rootJavaEEDepPrefix}}.ws.rs-api
+
+{{#openApiNullable}}
+
+ org.openapitools
+ jackson-databind-nullable
+ ${version.jackson.databind.nullable}
+
+{{/openApiNullable}}
+{{#jackson}}
+
+ org.glassfish.jersey.media
+ jersey-media-json-jackson
+
+{{/jackson}}
+{{#jsonb}}
+
+ org.glassfish.jersey.media
+ jersey-media-json-binding
+
+
+ {{x-helidon-rootJavaEEDepPrefix}}.json.bind
+ {{x-helidon-rootJavaEEDepPrefix}}.json.bind-api
+
+{{/jsonb}}
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ io.helidon.microprofile.tests
+ helidon-microprofile-tests-junit5
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-libs
+
+
+
+
+ org.jboss.jandex
+ jandex-maven-plugin
+
+
+ make-index
+
+
+
+
+
+
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/queryParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/queryParams.mustache
new file mode 100644
index 00000000000..38bfb9ed06e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/queryParams.mustache
@@ -0,0 +1 @@
+{{#isQueryParam}}@QueryParam("{{baseName}}"){{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}} {{^isContainer}}{{#defaultValue}}@DefaultValue("{{{.}}}") {{/defaultValue}}{{/isContainer}}{{{dataType}}} {{paramName}}{{/isQueryParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/returnAsyncTypeInterface.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/returnAsyncTypeInterface.mustache
new file mode 100644
index 00000000000..0da348c7a22
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/returnAsyncTypeInterface.mustache
@@ -0,0 +1 @@
+CompletionStage<{{#returnResponse}}Response{{/returnResponse}}{{^returnResponse}}{{#returnContainer}}{{#isMap}}Map{{/isMap}}{{#isArray}}{{{returnContainer}}}<{{{returnBaseType}}}>{{/isArray}}{{/returnContainer}}{{^returnContainer}}{{{returnBaseType}}}{{/returnContainer}}{{/returnResponse}}>
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/returnTypes.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/returnTypes.mustache
new file mode 100644
index 00000000000..87831bd299e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/returnTypes.mustache
@@ -0,0 +1 @@
+{{#returnResponse}}Response{{/returnResponse}}{{^returnResponse}}{{#returnContainer}}{{#isMap}}Map{{/isMap}}{{#isArray}}{{{returnContainer}}}<{{{returnBaseType}}}>{{/isArray}}{{/returnContainer}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnResponse}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/typeInfoAnnotation.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/typeInfoAnnotation.mustache
new file mode 100644
index 00000000000..c833321ebfa
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/mp/typeInfoAnnotation.mustache
@@ -0,0 +1,17 @@
+{{#jackson}}
+
+@JsonIgnoreProperties(
+ value = "{{{discriminator.propertyBaseName}}}", // ignore manually set {{{discriminator.propertyBaseName}}}, it will be automatically generated by Jackson during serialization
+ allowSetters = true // allows the {{{discriminator.propertyBaseName}}} to be set during deserialization
+)
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true)
+{{#discriminator.mappedModels}}
+{{#-first}}
+@JsonSubTypes({
+{{/-first}}
+ @JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
+{{#-last}}
+})
+{{/-last}}
+{{/discriminator.mappedModels}}
+{{/jackson}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/README.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/README.mustache
new file mode 100644
index 00000000000..8d2420f4631
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/README.mustache
@@ -0,0 +1,34 @@
+# Helidon SE Server with OpenAPI
+
+## Build and run
+
+With JDK11+
+```bash
+mvn package
+java -jar target/{{{artifactId}}}.jar
+```
+
+## Exercise the application
+
+```
+{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}curl -X {{httpMethod}} {{{basePath}}}{{{path}}}
+{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}
+```
+
+## Try health and metrics
+
+```
+curl -s -X GET {{{basePath}}}/health
+{"outcome":"UP",...
+. . .
+
+# Prometheus Format
+curl -s -X GET {{{basePath}}}/metrics
+# TYPE base:gc_g1_young_generation_count gauge
+. . .
+
+# JSON Format
+curl -H 'Accept: application/json' -X GET {{{basePath}}}/metrics
+{"base":...
+. . .
+```
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/additionalEnumTypeAnnotations.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/additionalEnumTypeAnnotations.mustache
new file mode 100644
index 00000000000..aa524798b42
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/additionalEnumTypeAnnotations.mustache
@@ -0,0 +1,2 @@
+{{#additionalEnumTypeAnnotations}}{{{.}}}
+{{/additionalEnumTypeAnnotations}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/additionalModelTypeAnnotations.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/additionalModelTypeAnnotations.mustache
new file mode 100644
index 00000000000..f4871c02cc2
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/additionalModelTypeAnnotations.mustache
@@ -0,0 +1,2 @@
+{{#additionalModelTypeAnnotations}}{{{.}}}
+{{/additionalModelTypeAnnotations}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/api.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/api.mustache
new file mode 100644
index 00000000000..c44408d778b
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/api.mustache
@@ -0,0 +1,78 @@
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+
+{{#useAbstractClass}}
+import java.util.Optional;
+import java.util.logging.Logger;
+
+import io.helidon.common.GenericType;
+import io.helidon.common.reactive.Single;
+{{/useAbstractClass}}
+import io.helidon.webserver.Routing;
+import io.helidon.webserver.ServerRequest;
+import io.helidon.webserver.ServerResponse;
+import io.helidon.webserver.Service;
+
+{{#operations}}
+{{^useAbstractClass}}public interface {{classname}} extends Service { {{/useAbstractClass}}
+{{#useAbstractClass}}public abstract class {{classname}} implements Service {
+
+ protected static final Logger LOGGER = Logger.getLogger({{classname}}.class.getName());
+{{#jackson}}
+ protected static final ObjectMapper MAPPER = JsonProvider.objectMapper();{{/jackson}}
+{{#jsonb}}
+ protected static final Jsonb JSONB = JsonbBuilder.create();{{/jsonb}}
+{{/useAbstractClass}}
+
+ /**
+ * A service registers itself by updating the routing rules.
+ * @param rules the routing rules.
+ */
+ @Override
+ {{#useAbstractClass}}public{{/useAbstractClass}}{{^useAbstractClass}}default{{/useAbstractClass}} void update(Routing.Rules rules) {
+{{#operation}}
+ rules.{{#lambda.lowercase}}{{httpMethod}}{{/lambda.lowercase}}("{{{path}}}", {{!
+ }}{{#bodyParam}}{{#isModel}}Handler.create({{{dataType}}}.class, {{/isModel}}this::{{{operationId}}}){{#isModel}}){{/isModel}}{{/bodyParam}}{{!
+ }}{{^bodyParam}}this::{{{operationId}}}){{/bodyParam}};
+{{/operation}}
+ }
+{{#useAbstractClass}}{{#isFormParamsFunctions}}
+
+ {{!}}{{>formParamsFunctions}}
+{{/isFormParamsFunctions}}{{/useAbstractClass}}
+{{#operation}}
+
+ /**
+ * {{httpMethod}} {{{path}}}{{#summary}} : {{.}}{{/summary}}.
+ * @param request the server request
+ * @param response the server response{{#allParams}}{{#isBodyParam}}{{#isModel}}
+ * @param {{paramName}} {{{description}}}{{^description}}{{paramName}}{{/description}} {{/isModel}}{{/isBodyParam}}{{/allParams}}
+ */
+ void {{{operationId}}}(ServerRequest request, ServerResponse response{{#allParams}}{{#isBodyParam}}{{#isModel}}, {{{dataType}}} {{paramName}}{{/isModel}}{{/isBodyParam}}{{/allParams}}){{^useAbstractClass}};{{/useAbstractClass}}{{#useAbstractClass}} { {{#formParams}}{{#-first}}
+ {{>formParamsInitial}}{{/-first}}{{/formParams}}
+ Single.create({{^hasParams}}Single.empty(){{/hasParams}}{{#hasParams}}{{^bodyParam}}{{#formParams}}{{#-first}}formSingle{{/-first}}{{/formParams}}{{^formParams}}Single.empty(){{/formParams}}{{/bodyParam}}{{#bodyParam}}{{^isModel}}request.content().as(new GenericType<{{{dataType}}}>() { }){{/isModel}}{{#isModel}}Single.empty(){{/isModel}}{{/bodyParam}}{{/hasParams}})
+ .thenAccept({{#bodyParam}}{{^isModel}}{{paramName}}{{/isModel}}{{#isModel}}val{{/isModel}}{{/bodyParam}}{{^bodyParam}}val{{/bodyParam}} -> {
+{{#allParams}}
+ {{> queryParams }}{{> pathParams }}{{> headerParams}}{{> bodyParams}}{{> formParams}}{{> cookieParams}}
+{{/allParams}}
+ handle{{#lambda.titlecase}}{{{operationId}}}{{/lambda.titlecase}}(request, response{{#allParams}}, {{paramName}}{{/allParams}});
+ })
+ .exceptionally(throwable -> handleError(request, response, throwable));
+ }
+
+ /**
+ * Handle {{httpMethod}} {{{path}}}{{#summary}} : {{.}}{{/summary}}.
+ * @param request the server request
+ * @param response the server response{{#allParams}}
+ * @param {{paramName}} {{{description}}}{{^description}}{{paramName}}{{/description}} {{/allParams}}
+ */
+ abstract void handle{{#lambda.titlecase}}{{{operationId}}}{{/lambda.titlecase}}(ServerRequest request, ServerResponse response{{#allParams}}, {{>dataType}} {{paramName}}{{/allParams}});
+{{/useAbstractClass}}
+
+{{/operation}}
+{{#useAbstractClass}} abstract Void handleError(ServerRequest request, ServerResponse response, Throwable throwable);{{!
+}}{{/useAbstractClass}}
+}
+{{/operations}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/apiImpl.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/apiImpl.mustache
new file mode 100644
index 00000000000..b6cf71293f5
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/apiImpl.mustache
@@ -0,0 +1,40 @@
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+{{^useAbstractClass}}
+import java.util.logging.Logger;{{/useAbstractClass}}
+
+import io.helidon.webserver.ServerRequest;
+import io.helidon.webserver.ServerResponse;
+
+{{#operations}}
+public class {{classname}}Impl {{^useAbstractClass}}implements{{/useAbstractClass}}{{#useAbstractClass}}extends{{/useAbstractClass}} {{classname}} {
+
+ private static final int HTTP_CODE_NOT_IMPLEMENTED = 501;
+{{^useAbstractClass}}
+ private static final Logger LOGGER = Logger.getLogger({{classname}}.class.getName());
+{{#jackson}}
+ private static final ObjectMapper MAPPER = JsonProvider.objectMapper();{{/jackson}}
+{{#jsonb}}
+ private static final Jsonb JSONB = JsonbBuilder.create();{{/jsonb}}
+{{/useAbstractClass}}
+{{#operation}}
+
+{{#useAbstractClass}}
+ public void handle{{#lambda.titlecase}}{{{operationId}}}{{/lambda.titlecase}}(ServerRequest request, ServerResponse response{{#allParams}}, {{>dataType}} {{paramName}}{{/allParams}}) {
+{{/useAbstractClass}}
+{{^useAbstractClass}}
+ public void {{{operationId}}}(ServerRequest request, ServerResponse response{{#allParams}}{{#isBodyParam}}{{#isModel}}, {{{dataType}}} {{paramName}}{{/isModel}}{{/isBodyParam}}{{/allParams}}) {
+{{/useAbstractClass}}
+ response.status(HTTP_CODE_NOT_IMPLEMENTED).send();
+ }
+{{/operation}}
+
+{{#useAbstractClass}}
+ public Void handleError(ServerRequest request, ServerResponse response, Throwable throwable) {
+ return response.send(throwable);
+ }
+{{/useAbstractClass}}
+}
+{{/operations}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/application.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/application.mustache
new file mode 100644
index 00000000000..2418f6ef270
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/application.mustache
@@ -0,0 +1,3 @@
+server:
+ port: {{port}}{{^port}}8080{{/port}}
+ host: {{host}}{{^host}}localhost{{/host}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationCore.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationCore.mustache
new file mode 100644
index 00000000000..d0479eb939e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationCore.mustache
@@ -0,0 +1,16 @@
+{{#pattern}}{{#isString}}
+ ValidatorUtils.validatePattern({{paramName}}, "{{{pattern}}}");{{/isString}}{{/pattern}}{{#minLength}}{{#maxLength}}
+ ValidatorUtils.validateSize({{paramName}}, {{minLength}}, {{maxLength}});{{/maxLength}}{{/minLength}}{{#minLength}}{{^maxLength}}
+ ValidatorUtils.validateSize({{paramName}}, {{minLength}}, null);{{/maxLength}}{{/minLength}}{{^minLength}}{{#maxLength}}
+ ValidatorUtils.validateSize({{paramName}}, null, {{.}});{{/maxLength}}{{/minLength}}{{#minItems}}{{#maxItems}}
+ ValidatorUtils.validateSize({{paramName}}, {{minItems}}, {{maxItems}});{{/maxItems}}{{/minItems}}{{#minItems}}{{^maxItems}}
+ ValidatorUtils.validateSize({{paramName}}, {{minItems}}, null);{{/maxItems}}{{/minItems}}{{^minItems}}{{#maxItems}}
+ ValidatorUtils.validateSize({{paramName}}, null, {{.}});{{/maxItems}}{{/minItems}}{{#useBeanValidation}}{{#isEmail}}
+ //RFC 5322 for Email Validation
+ ValidatorUtils.validatePattern({{paramName}}, "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$");{{/isEmail}}{{/useBeanValidation}}{{#isInteger}}{{#minimum}}
+ ValidatorUtils.validateMin({{paramName}}, {{.}});{{/minimum}}{{#maximum}}
+ ValidatorUtils.validateMax({{paramName}}, {{.}});{{/maximum}}{{/isInteger}}{{#isLong}}{{#minimum}}
+ ValidatorUtils.validateMin({{paramName}}.intValue(), {{.}});{{/minimum}}{{#maximum}}
+ ValidatorUtils.validateMax({{paramName}}.intValue(), {{.}});{{/maximum}}{{/isLong}}{{^isInteger}}{{^isLong}}{{#minimum}}
+ ValidatorUtils.validateMin({{paramName}}, "{{minimum}}", {{#exclusiveMinimum}}false{{/exclusiveMinimum}}{{^exclusiveMinimum}}true{{/exclusiveMinimum}});{{/minimum}}{{#maximum}}
+ ValidatorUtils.validateMax({{paramName}}, "{{maximum}}", {{#exclusiveMaximum}}false{{/exclusiveMaximum}}{{^exclusiveMaximum}}true{{/exclusiveMaximum}});{{/maximum}}{{/isLong}}{{/isInteger}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationHeaderParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationHeaderParams.mustache
new file mode 100644
index 00000000000..b590d59fd0d
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationHeaderParams.mustache
@@ -0,0 +1,2 @@
+{{#required}}{{!}}
+ {{!}}ValidatorUtils.checkNonNull({{paramName}});{{/required}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationPathParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationPathParams.mustache
new file mode 100644
index 00000000000..60b256f885e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationPathParams.mustache
@@ -0,0 +1,2 @@
+{{! PathParam is always required, no @NotNull necessary }}
+ValidatorUtils.checkNonNull({{paramName}});{{#isPrimitiveType}}{{>beanValidationCore}}{{/isPrimitiveType}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationQueryParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationQueryParams.mustache
new file mode 100644
index 00000000000..dfec605af6e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/beanValidationQueryParams.mustache
@@ -0,0 +1,2 @@
+{{#required}}{{!}}
+ {{!}}ValidatorUtils.checkNonNull({{paramName}});{{/required}}{{#isPrimitiveType}}{{>beanValidationCore}}{{/isPrimitiveType}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/bodyParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/bodyParams.mustache
new file mode 100644
index 00000000000..7994e23e023
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/bodyParams.mustache
@@ -0,0 +1 @@
+{{#isBodyParam}}ValidatorUtils.checkNonNull({{paramName}});{{/isBodyParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/build.gradle.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/build.gradle.mustache
new file mode 100644
index 00000000000..32b1002ae42
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/build.gradle.mustache
@@ -0,0 +1,88 @@
+plugins {
+ id 'java'
+ id 'application'
+}
+
+group = '{{{groupId}}}'
+version = '{{{artifactVersion}}}'
+
+{{#appDescription}}
+description = """{{.}}"""
+{{/appDescription}}
+
+
+sourceCompatibility = 11
+targetCompatibility = 11
+
+tasks.withType(JavaCompile) {
+ options.encoding = 'UTF-8'
+}
+
+ext {
+ helidonVersion = '{{{helidonVersion}}}'
+{{^interfaceOnly}}
+ mainClass='{{{invokerPackage}}}.Main'
+{{/interfaceOnly}}
+ validationApiVersion = '2.0.1.Final'
+}
+
+test {
+ useJUnitPlatform()
+}
+
+repositories {
+ mavenCentral()
+ mavenLocal()
+}
+
+dependencies {
+ // import Helidon BOM
+ implementation enforcedPlatform("io.helidon:helidon-dependencies:${project.helidonVersion}")
+ implementation "{{x-helidon-validationArtifactPrefix}}.validation:{{x-helidon-validationArtifactPrefix}}validation-api:${project.validationApiVersion}"
+ implementation 'io.helidon.webserver:helidon-webserver'
+ implementation 'io.helidon.media:helidon-media-jsonp'
+{{#jackson}}
+ implementation 'io.helidon.media:helidon-media-jackson'
+{{/jackson}}
+{{#jsonb}}
+ implementation 'io.helidon.media:helidon-media-jsonb'
+{{/jsonb}}
+ implementation 'io.helidon.media:helidon-media-multipart'
+ implementation 'io.helidon.config:helidon-config-yaml'
+ implementation 'io.helidon.health:helidon-health'
+ implementation 'io.helidon.health:helidon-health-checks'
+ implementation 'io.helidon.metrics:helidon-metrics'
+ implementation 'io.helidon.openapi:helidon-openapi'
+ testImplementation 'org.junit.jupiter:junit-jupiter-api'
+ testImplementation 'io.helidon.webclient:helidon-webclient'
+ testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
+}
+
+// define a custom task to copy all dependencies in the runtime classpath
+// into build/libs/libs
+// uses built-in Copy
+task copyLibs(type: Copy) {
+ from configurations.runtimeClasspath
+ into 'build/libs/libs'
+}
+
+// add it as a dependency of built-in task 'assemble'
+copyLibs.dependsOn jar
+assemble.dependsOn copyLibs
+
+// default jar configuration
+// set the main classpath
+// add each jar under build/libs/libs into the classpath
+jar {
+ archiveFileName = "${project.name}.jar"
+ manifest {
+ attributes ({{^interfaceOnly}}'Main-Class': "${project.mainClass}",{{/interfaceOnly}}
+ 'Class-Path': configurations.runtimeClasspath.files.collect { "libs/$it.name" }.join(' ')
+ )
+ }
+}
+{{^interfaceOnly}}
+application {
+mainClass = "${project.mainClass}"
+}
+{{/interfaceOnly}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/cookieParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/cookieParams.mustache
new file mode 100644
index 00000000000..c11ce657251
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/cookieParams.mustache
@@ -0,0 +1 @@
+{{#isCookieParam}}{{>dataType}} {{paramName}} = {{>paramValue}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{/isCookieParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/dataType.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/dataType.mustache
new file mode 100644
index 00000000000..cc2a3d0d4df
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/dataType.mustache
@@ -0,0 +1,11 @@
+{{#isPrimitiveType}}{{^isFile}}{{{dataType}}}{{/isFile}}{{#isFile}}InputStream{{/isFile}}{{/isPrimitiveType}}{{!
+}}{{^isPrimitiveType}}{{!
+ }}{{#isArray}}{{!
+ }}{{#isBodyParam}}{{{dataType}}}{{/isBodyParam}}{{!
+ }}{{^isBodyParam}}{{!
+ }}List<{{#isFormParam}}{{#isFile}}InputStream{{/isFile}}{{^isFile}}String{{/isFile}}{{/isFormParam}}{{!
+ }}{{^isFormParam}}{{#isModel}}{{{dataType}}}{{/isModel}}{{^isModel}}String{{/isModel}}{{/isFormParam}}>{{!
+ }}{{/isBodyParam}}{{!
+ }}{{/isArray}}{{!
+ }}{{^isArray}}{{^isModel}}String{{/isModel}}{{#isModel}}{{{dataType}}}{{/isModel}}{{/isArray}}{{!
+}}{{/isPrimitiveType}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/enumClass.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/enumClass.mustache
new file mode 100644
index 00000000000..b9eeee00409
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/enumClass.mustache
@@ -0,0 +1,62 @@
+ /**
+ * {{^description}}Gets or Sets {{{name}}}{{/description}}{{{description}}}
+ */
+ {{#jsonb}}
+ @JsonbTypeSerializer({{datatypeWithEnum}}.Serializer.class)
+ @JsonbTypeDeserializer({{datatypeWithEnum}}.Deserializer.class)
+ {{/jsonb}}
+ {{>additionalEnumTypeAnnotations}}public enum {{{datatypeWithEnum}}} {
+ {{#allowableValues}}{{#enumVars}}{{{name}}}({{{value}}}){{^-last}},
+ {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}}
+
+ private {{{dataType}}} value;
+
+ {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}({{{dataType}}} value) {
+ this.value = value;
+ }
+
+ {{#jackson}}
+ @JsonValue
+ {{/jackson}}
+ public {{{dataType}}} getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ {{#jsonb}}
+ public static final class Deserializer implements JsonbDeserializer<{{datatypeWithEnum}}> {
+ @Override
+ public {{datatypeWithEnum}} deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (String.valueOf(b.value).equals(parser.getString())) {
+ return b;
+ }
+ }
+ {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + parser.getString() + "'");{{/useNullForUnknownEnumValue}}
+ }
+ }
+
+ public static final class Serializer implements JsonbSerializer<{{datatypeWithEnum}}> {
+ @Override
+ public void serialize({{datatypeWithEnum}} obj, JsonGenerator generator, SerializationContext ctx) {
+ generator.write(obj.value);
+ }
+ }
+ {{/jsonb}}
+
+ {{#jackson}}
+ @JsonCreator
+ {{/jackson}}
+ public static {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue(String text) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (String.valueOf(b.value).equals(text)) {
+ return b;
+ }
+ }
+ {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + text + "'");{{/useNullForUnknownEnumValue}}
+ }
+ }
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/enumOuterClass.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/enumOuterClass.mustache
new file mode 100644
index 00000000000..a695da1902a
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/enumOuterClass.mustache
@@ -0,0 +1,80 @@
+{{#jsonb}}import java.lang.reflect.Type;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeDeserializer;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.DeserializationContext;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbDeserializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.SerializationContext;
+import {{rootJavaEEPackage}}.json.stream.JsonGenerator;
+import {{rootJavaEEPackage}}.json.stream.JsonParser;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbProperty;
+{{#vendorExtensions.x-has-readonly-properties}}
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbCreator;
+{{/vendorExtensions.x-has-readonly-properties}}{{/jsonb}}
+{{#jackson}}
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;{{/jackson}}
+
+/**
+ * {{^description}}Gets or Sets {{{name}}}{{/description}}{{{description}}}
+ */
+{{#jsonb}}
+@JsonbTypeSerializer({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.Serializer.class)
+@JsonbTypeDeserializer({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.Deserializer.class){{/jsonb}}
+public enum {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} {
+
+{{#allowableValues}}
+ {{#enumVars}}
+ {{{name}}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}}
+ {{/enumVars}}
+{{/allowableValues}}
+
+ private {{{dataType}}} value;
+
+ {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}({{{dataType}}} value) {
+ this.value = value;
+ }
+
+ {{#jackson}}
+ @JsonValue
+ {{/jackson}}
+ public {{{dataType}}} getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+{{#jsonb}}
+ public static final class Deserializer implements JsonbDeserializer<{{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}> {
+ @Override
+ public {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (String.valueOf(b.value).equals(parser.getString())) {
+ return b;
+ }
+ }
+ {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + parser.getString() + "'");{{/useNullForUnknownEnumValue}}
+ }
+ }
+
+ public static final class Serializer implements JsonbSerializer<{{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}> {
+ @Override
+ public void serialize({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} obj, JsonGenerator generator, SerializationContext ctx) {
+ generator.write(obj.value);
+ }
+ }
+{{/jsonb}}
+{{#jackson}}
+ @JsonCreator{{/jackson}}
+ public static {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue(String text) {
+ for ({{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{{datatypeWithEnum}}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) {
+ if (String.valueOf(b.value).equals(text)) {
+ return b;
+ }
+ }
+ {{#useNullForUnknownEnumValue}}return null;{{/useNullForUnknownEnumValue}}{{^useNullForUnknownEnumValue}}throw new IllegalArgumentException("Unexpected value '" + text + "'");{{/useNullForUnknownEnumValue}}
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/formParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/formParams.mustache
new file mode 100644
index 00000000000..82c0f5d715c
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/formParams.mustache
@@ -0,0 +1 @@
+{{#isFormParam}}{{^isFile}}{{>dataType}} {{paramName}} = {{>paramValue}}{{/isFile}}{{#isFile}}{{#isArray}}List<{{/isArray}}InputStream{{#isArray}}>{{/isArray}} {{paramName}} = {{>paramValue}}{{/isFile}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{/isFormParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/formParamsFunctions.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/formParamsFunctions.mustache
new file mode 100644
index 00000000000..f4e382d4810
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/formParamsFunctions.mustache
@@ -0,0 +1,17 @@
+private void processNonFileFormField(String name, Map> nonFileFormContent, ReadableBodyPart part) {
+ List content = nonFileFormContent.computeIfAbsent(name, key -> new ArrayList<>());
+ part.content().as(String.class).thenAccept(content::add);
+ }
+
+ private void processFileFormField(String name, Map> fileFormContent, ReadableBodyPart part) {
+ List content = fileFormContent.computeIfAbsent(name, key -> new ArrayList<>());
+ part.content().map(DataChunk::bytes)
+ .collect(ByteArrayOutputStream::new, (stream, bytes) -> {
+ try {
+ stream.write(bytes);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ })
+ .thenAccept(byteStream -> content.add(new ByteArrayInputStream(byteStream.toByteArray())));
+ }
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/formParamsInitial.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/formParamsInitial.mustache
new file mode 100644
index 00000000000..08d90802b6c
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/formParamsInitial.mustache
@@ -0,0 +1,11 @@
+Map> nonFileFormContent = new HashMap<>();
+ Map> fileFormContent = new HashMap<>();
+ Single formSingle = request.content().asStream(ReadableBodyPart.class)
+ .forEach(part -> {
+ String name = part.name();{{#formParams}}
+ if ("{{baseName}}".equals(name)) {
+ {{^isFile}}processNonFileFormField(name, nonFileFormContent, part);{{/isFile}}{{!
+ }}{{#isFile}}processFileFormField(name, fileFormContent, part);{{/isFile}}
+ }{{/formParams}}
+ part.drain();
+ });
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/generatedAnnotation.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/generatedAnnotation.mustache
new file mode 100644
index 00000000000..6f4eb2cb74f
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/generatedAnnotation.mustache
@@ -0,0 +1 @@
+@{{rootJavaEEPackage}}.annotation.Generated(value = "{{{generatorClass}}}"{{^hideGenerationTimestamp}}, date = "{{{generatedDate}}}"{{/hideGenerationTimestamp}})
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/headerParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/headerParams.mustache
new file mode 100644
index 00000000000..89fb5e8f51b
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/headerParams.mustache
@@ -0,0 +1 @@
+{{#isHeaderParam}}{{>dataType}} {{paramName}} = {{>paramValue}}{{#useBeanValidation}}{{>beanValidationHeaderParams}}{{/useBeanValidation}}{{/isHeaderParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/jsonProvider.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/jsonProvider.mustache
new file mode 100644
index 00000000000..9a3b6f4c107
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/jsonProvider.mustache
@@ -0,0 +1,20 @@
+package {{apiPackage}};
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+
+public class JsonProvider {
+
+ public static ObjectMapper objectMapper() {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.registerModule(new JavaTimeModule());
+ mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+ mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
+ mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);
+ return mapper;
+ }
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/main.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/main.mustache
new file mode 100644
index 00000000000..575d3704448
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/main.mustache
@@ -0,0 +1,101 @@
+package {{invokerPackage}};
+{{#apiInfo}}{{#apis}}{{#operations}}
+import {{package}}.{{classname}}Impl;{{/operations}}{{/apis}}{{/apiInfo}}
+
+import io.helidon.common.LogConfig;
+import io.helidon.common.reactive.Single;
+import io.helidon.config.Config;
+import io.helidon.health.HealthSupport;
+import io.helidon.health.checks.HealthChecks;
+import io.helidon.media.jsonp.JsonpSupport;
+{{#jsonb}}
+import io.helidon.media.jsonb.JsonbSupport;
+{{/jsonb}}
+{{#jackson}}
+import io.helidon.media.jackson.JacksonSupport;
+import {{apiPackage}}.JsonProvider;
+{{/jackson}}
+import io.helidon.metrics.MetricsSupport;
+import io.helidon.openapi.OpenAPISupport;
+import io.helidon.webserver.Routing;
+import io.helidon.webserver.WebServer;
+
+/**
+* The application main class.
+*/
+public final class Main {
+
+ /**
+ * Cannot be instantiated.
+ */
+ private Main() {
+ }
+
+ /**
+ * Application main entry point.
+ * @param args command line arguments.
+ */
+ public static void main(final String[] args) {
+ startServer();
+ }
+
+ /**
+ * Start the server.
+ * @return the created {@link WebServer} instance
+ */
+ static Single startServer() {
+
+ // load logging configuration
+ LogConfig.configureRuntime();
+
+ // By default this will pick up application.yaml from the classpath
+ Config config = Config.create();
+
+ WebServer server = WebServer.builder(createRouting(config))
+ .config(config.get("server"))
+ .addMediaSupport(JsonpSupport.create())
+{{#jsonb}}
+ .addMediaSupport(JsonbSupport.create())
+{{/jsonb}}
+{{#jackson}}
+ .addMediaSupport(JacksonSupport.create(JsonProvider.objectMapper()))
+{{/jackson}}
+ .build();
+
+ Single webserver = server.start();
+
+ // Try to start the server. If successful, print some info and arrange to
+ // print a message at shutdown. If unsuccessful, print the exception.
+ webserver.thenAccept(ws -> {
+ System.out.println("WEB server is up! {{{basePath}}}");
+ ws.whenShutdown().thenRun(() -> System.out.println("WEB server is DOWN. Good bye!"));
+ })
+ .exceptionallyAccept(t -> {
+ System.err.println("Startup failed: " + t.getMessage());
+ t.printStackTrace(System.err);
+ });
+
+ return webserver;
+ }
+
+ /**
+ * Creates new {@link Routing}.
+ *
+ * @return routing configured with JSON support, a health check, and a service
+ * @param config configuration of this server
+ */
+ private static Routing createRouting(Config config) {
+
+ MetricsSupport metrics = MetricsSupport.create();
+ HealthSupport health = HealthSupport.builder()
+ .addLiveness(HealthChecks.healthChecks()) // Adds a convenient set of checks
+ .build();
+
+ return Routing.builder()
+ .register(OpenAPISupport.create(config.get(OpenAPISupport.Builder.CONFIG_KEY)))
+ .register(health) // Health at "/health"
+ .register(metrics) // Metrics at "/metrics"{{#apiInfo}}{{#apis}}{{#operations}}
+ .register("/", new {{classname}}Impl()){{/operations}}{{/apis}}{{/apiInfo}}
+ .build();
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/mainTest.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/mainTest.mustache
new file mode 100644
index 00000000000..78c4e89b589
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/mainTest.mustache
@@ -0,0 +1,47 @@
+package {{invokerPackage}};
+
+import java.util.Collections;
+import java.util.concurrent.TimeUnit;
+
+import {{rootJavaEEPackage}}.json.Json;
+import {{rootJavaEEPackage}}.json.JsonBuilderFactory;
+
+import io.helidon.media.jsonp.JsonpSupport;
+import io.helidon.webclient.WebClient;
+import io.helidon.webserver.WebServer;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+@Disabled
+public class MainTest {
+
+ private static WebServer webServer;
+ private static WebClient webClient;
+ private static final JsonBuilderFactory JSON_BUILDER = Json.createBuilderFactory(Collections.emptyMap());
+
+ @BeforeAll
+ public static void startTheServer() throws Exception {
+ webServer = Main.startServer().await();
+
+ webClient = WebClient.builder()
+ .baseUri("http://localhost:" + webServer.port())
+ .addMediaSupport(JsonpSupport.create())
+ .build();
+ }
+
+ @AfterAll
+ public static void stopServer() throws Exception {
+ if (webServer != null) {
+ webServer.shutdown()
+ .toCompletableFuture()
+ .get(10, TimeUnit.SECONDS);
+ }
+ }
+
+ @Test
+ public void test() throws Exception {
+ }
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/model.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/model.mustache
new file mode 100644
index 00000000000..dbe0359ada4
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/model.mustache
@@ -0,0 +1,10 @@
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+{{#models}}
+{{#model}}{{#isEnum}}
+{{>enumOuterClass}}{{/isEnum}}{{^isEnum}}
+{{>pojo}}{{/isEnum}}
+{{/model}}
+{{/models}}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/paramValue.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/paramValue.mustache
new file mode 100644
index 00000000000..52ad10dd603
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/paramValue.mustache
@@ -0,0 +1,14 @@
+{{#isPathParam}}Optional.ofNullable(request.path().param("{{baseName}}")){{/isPathParam}}{{!
+}}{{#isQueryParam}}{{#isPrimitiveType}}request.queryParams().toMap().getOrDefault("{{baseName}}", List.of()).stream().findFirst(){{/isPrimitiveType}}{{/isQueryParam}}{{!
+}}{{#isQueryParam}}{{^isPrimitiveType}}Optional.ofNullable(request.queryParams().toMap().get("{{baseName}}")){{/isPrimitiveType}}{{/isQueryParam}}{{!
+}}{{#isCookieParam}}{{#isPrimitiveType}}request.headers().cookies().toMap().getOrDefault("{{baseName}}", List.of()).stream().findFirst(){{/isPrimitiveType}}{{/isCookieParam}}{{!
+}}{{#isCookieParam}}{{^isPrimitiveType}}Optional.ofNullable(request.headers().cookies().toMap().get("{{baseName}}")){{/isPrimitiveType}}{{/isCookieParam}}{{!
+}}{{#isHeaderParam}}request.headers().value("{{baseName}}"){{/isHeaderParam}}{{!
+}}{{#isFormParam}}Optional.ofNullable({{#isFile}}fileFormContent{{/isFile}}{{^isFile}}nonFileFormContent{{/isFile}}.get("{{baseName}}")){{^isArray}}.flatMap(list->list.stream().findFirst()){{/isArray}}{{/isFormParam}}{{!
+}}{{#isPrimitiveType}}{{^isFile}}{{^isString}}.map({{!
+ }}{{#isDecimal}}BigDecimal::new{{/isDecimal}}{{!
+ }}{{#isNumber}}BigDecimal::new{{/isNumber}}{{!
+ }}{{#isDate}}LocalDate::parse{{/isDate}}{{#isDateTime}}OffsetDateTime::parse{{/isDateTime}}{{!
+ }}{{^isDecimal}}{{^isNumber}}{{^isDate}}{{^isDateTime}}{{{dataType}}}::valueOf{{/isDateTime}}{{/isDate}}{{/isNumber}}{{/isDecimal}}){{!
+}}{{/isString}}{{/isFile}}{{/isPrimitiveType}}{{!
+}}.orElse(null);
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/pathParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/pathParams.mustache
new file mode 100644
index 00000000000..14464296f11
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/pathParams.mustache
@@ -0,0 +1,2 @@
+{{#isPathParam}}{{> dataType }} {{paramName}} = {{> paramValue }}{{#useBeanValidation}}
+ {{>beanValidationPathParams}}{{/useBeanValidation}}{{/isPathParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/pojo.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/pojo.mustache
new file mode 100644
index 00000000000..944ae482956
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/pojo.mustache
@@ -0,0 +1,121 @@
+{{#jsonb}}
+import java.lang.reflect.Type;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeDeserializer;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbTypeSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.DeserializationContext;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbDeserializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.JsonbSerializer;
+import {{rootJavaEEPackage}}.json.bind.serializer.SerializationContext;
+import {{rootJavaEEPackage}}.json.stream.JsonGenerator;
+import {{rootJavaEEPackage}}.json.stream.JsonParser;
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbProperty;
+{{#vendorExtensions.x-has-readonly-properties}}
+import {{rootJavaEEPackage}}.json.bind.annotation.JsonbCreator;
+{{/vendorExtensions.x-has-readonly-properties}}
+{{/jsonb}}
+
+{{#description}}
+/**
+ * {{{.}}}
+ */{{/description}}
+public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}} {{#vendorExtensions.x-implements}}{{#-first}}implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{/vendorExtensions.x-implements}} {
+
+{{#vars}}
+ {{#isEnum}}
+
+ {{^isContainer}}
+{{>enumClass}}
+ {{/isContainer}}
+ {{#isContainer}}
+ {{#mostInnerItems}}
+{{>enumClass}}
+ {{/mostInnerItems}}
+ {{/isContainer}}
+
+ {{/isEnum}}
+ private {{{datatypeWithEnum}}} {{{name}}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};
+{{/vars}}
+
+ /**
+ * Default constructor.
+ */
+ public {{classname}}() {
+ // JSON-B / Jackson
+ }
+
+ /**
+ * Create {{classname}}.
+ *
+{{#vars}}
+ * @param {{name}} {{description}}{{^description}}{{name}}{{/description}}
+{{/vars}}
+ */
+ public {{classname}}(
+{{#vars}}
+ {{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}
+{{/vars}}
+ ) {
+{{#vars}}
+ this.{{name}} = {{name}};
+{{/vars}}
+ }
+
+{{#vars}}{{#vendorExtensions.x-has-readonly-properties}}{{#jsonb}}
+ @JsonbCreator
+ public {{classname}}(
+ {{#readOnlyVars}}
+ @JsonbProperty("{{baseName}}") {{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}
+ {{/readOnlyVars}}
+ ) {
+ {{#readOnlyVars}}
+ this.{{name}} = {{name}};
+ {{/readOnlyVars}}
+ }{{/jsonb}}{{/vendorExtensions.x-has-readonly-properties}}
+
+ /**
+ {{#description}}
+ * {{{.}}}
+ {{/description}}
+ {{^description}}
+ * Get {{name}}
+ {{/description}}
+ {{#minimum}}
+ * minimum: {{.}}
+ {{/minimum}}
+ {{#maximum}}
+ * maximum: {{.}}
+ {{/maximum}}
+ * @return {{name}}
+ */
+ public {{{datatypeWithEnum}}} {{getter}}() {
+ return {{name}};
+ }
+
+ public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {
+ this.{{name}} = {{name}};
+ }{{/vars}}
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class {{classname}} {\n");
+ {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}}
+ {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n");
+ {{/vars}}sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/pom.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/pom.mustache
new file mode 100644
index 00000000000..720ea80bde4
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/pom.mustache
@@ -0,0 +1,116 @@
+
+
+ 4.0.0
+
+ io.helidon.applications
+ helidon-se
+ {{{helidonVersion}}}
+
+
+ {{{groupId}}}
+ {{{artifactId}}}
+ {{{artifactVersion}}}
+ {{{artifactId}}}
+ {{#appDescription}}
+ {{.}}
+ {{/appDescription}}
+
+
+ {{{invokerPackage}}}.Main
+ 0.2.3
+
+
+
+
+ {{x-helidon-rootJavaEEDepPrefix}}.validation
+ {{x-helidon-validationArtifactPrefix}}validation-api
+
+
+ io.helidon.webserver
+ helidon-webserver
+
+
+ io.helidon.media
+ helidon-media-jsonp
+
+
+ io.helidon.media
+ helidon-media-multipart
+
+
+ io.helidon.config
+ helidon-config-yaml
+
+
+ io.helidon.health
+ helidon-health
+
+
+ io.helidon.health
+ helidon-health-checks
+
+
+ io.helidon.metrics
+ helidon-metrics
+
+
+ io.helidon.openapi
+ helidon-openapi
+
+{{#openApiNullable}}
+
+ org.openapitools
+ jackson-databind-nullable
+ ${version.jackson.databind.nullable}
+
+{{/openApiNullable}}
+{{#jackson}}
+
+ io.helidon.media
+ helidon-media-jackson
+
+{{/jackson}}
+{{#jsonb}}
+
+ io.helidon.media
+ helidon-media-jsonb
+ ${helidon.version}
+
+{{/jsonb}}
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ io.helidon.webclient
+ helidon-webclient
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-libs
+
+
+
+
+ io.helidon.build-tools
+ helidon-maven-plugin
+
+
+ third-party-license-report
+
+
+
+
+
+
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/queryParams.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/queryParams.mustache
new file mode 100644
index 00000000000..6b276964518
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/queryParams.mustache
@@ -0,0 +1 @@
+{{#isQueryParam}}{{>dataType}} {{paramName}} = {{>paramValue}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{/isQueryParam}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/validatorUtils.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/validatorUtils.mustache
new file mode 100644
index 00000000000..323407d0c14
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/libraries/se/validatorUtils.mustache
@@ -0,0 +1,112 @@
+package {{apiPackage}};
+
+import java.lang.reflect.Array;
+import java.math.BigDecimal;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Objects;
+
+import {{rootJavaEEPackage}}.validation.ValidationException;
+
+/**
+* Validation utility methods.
+*/
+public final class ValidatorUtils {
+
+ public static boolean validateMin(Integer value, Integer min) {
+ checkNonNull(value);
+ if (value < min) {
+ throw new ValidationException(String.format("%s is less than %s", value, min));
+ }
+ return true;
+ }
+
+ public static boolean validateMax(Integer value, Integer max) {
+ checkNonNull(value);
+ if (value > max) {
+ throw new ValidationException(String.format("%s is more than %s", value, max));
+ }
+ return true;
+ }
+
+ public static boolean validateSize(Object value, Integer min, Integer max) {
+ checkNonNull(value);
+ Integer size = -1;
+ if (value instanceof Map) {
+ size = ((Map, ?>) value).size();
+ }
+ if (value instanceof CharSequence) {
+ size = ((CharSequence) value).length();
+ }
+ if (value instanceof Collection) {
+ size = ((Collection>) value).size();
+ }
+ if (value.getClass().isArray()) {
+ size = Array.getLength(value);
+ }
+ if (size == -1) {
+ throw new ValidationException("Value has incorrect type");
+ }
+ if (min != null) {
+ validateMin(size, min);
+ }
+ if (max != null) {
+ validateMax(size, max);
+ }
+ return true;
+ }
+
+ public static boolean validatePattern(String value, String pattern) {
+ checkNonNull(value, pattern);
+ if (value.matches(pattern)) {
+ return true;
+ }
+ throw new ValidationException(String.format("'%s' does not match the pattern '%s'", value, pattern));
+ }
+
+ public static boolean validateMin(BigDecimal value, String stringMinValue, boolean inclusive) {
+ checkNonNull(value);
+ BigDecimal minValue = new BigDecimal(stringMinValue);
+ int result = value.compareTo(minValue);
+ if (inclusive) {
+ if (result >= 0) {
+ return true;
+ }
+ } else {
+ if (result > 0) {
+ return true;
+ }
+ }
+ throw new ValidationException(
+ String.format("%s is not valid value. Min value '%s'. Inclusive - %s.", value, stringMinValue, inclusive)
+ );
+ }
+
+ public static boolean validateMax(BigDecimal value, String stringMaxValue, boolean inclusive) {
+ checkNonNull(value);
+ BigDecimal maxValue = new BigDecimal(stringMaxValue);
+ int result = value.compareTo(maxValue);
+ if (inclusive) {
+ if (result <= 0) {
+ return true;
+ }
+ } else {
+ if (result < 0) {
+ return true;
+ }
+ }
+ throw new ValidationException(
+ String.format("%s is not valid value. Max value '%s'. Inclusive - %s.", value, stringMaxValue, inclusive)
+ );
+ }
+
+ public static void checkNonNull(Object... args) {
+ try {
+ for (Object o : args) {
+ Objects.requireNonNull(o);
+ }
+ } catch (Exception e) {
+ throw new ValidationException(e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/licenseInfo.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/licenseInfo.mustache
new file mode 100644
index 00000000000..c66209f2794
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/licenseInfo.mustache
@@ -0,0 +1,11 @@
+/*
+ * {{{appName}}}
+ * {{{appDescription}}}
+ *
+ * {{#version}}The version of the OpenAPI document: {{{.}}}{{/version}}
+ * {{#infoEmail}}Contact: {{{.}}}{{/infoEmail}}
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/logging.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/logging.mustache
new file mode 100644
index 00000000000..cd238eb6615
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/logging.mustache
@@ -0,0 +1,19 @@
+
+# Example Logging Configuration File
+# For more information see $JAVA_HOME/jre/lib/logging.properties
+
+# Send messages to the console
+handlers=io.helidon.common.HelidonConsoleHandler
+
+# HelidonConsoleHandler uses a SimpleFormatter subclass that replaces "!thread!" with the current thread
+java.util.logging.SimpleFormatter.format=%1$tY.%1$tm.%1$td %1$tH:%1$tM:%1$tS %4$s %3$s !thread!: %5$s%6$s%n
+
+# Global logging level. Can be overridden by specific loggers
+.level=INFO
+
+# Component specific log levels
+#io.helidon.webserver.level=INFO
+#io.helidon.config.level=INFO
+#io.helidon.security.level=INFO
+#io.helidon.common.level=INFO
+#io.netty.level=INFO
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/model_test.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/model_test.mustache
new file mode 100644
index 00000000000..c0fa11d1810
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/model_test.mustache
@@ -0,0 +1,47 @@
+{{>licenseInfo}}
+package {{package}};
+
+{{#imports}}import {{import}};
+{{/imports}}
+import org.junit.jupiter.api.Test;
+
+{{#fullJavaUtil}}
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+{{/fullJavaUtil}}
+
+/**
+ * Model tests for {{classname}}
+ */
+public class {{classname}}Test {
+ {{#models}}
+ {{#model}}
+ {{^vendorExtensions.x-is-one-of-interface}}
+ {{^isEnum}}
+ private final {{classname}} model = new {{classname}}();
+
+ {{/isEnum}}
+ /**
+ * Model tests for {{classname}}
+ */
+ @Test
+ public void test{{classname}}() {
+ // TODO: test {{classname}}
+ }
+
+ {{#allVars}}
+ /**
+ * Test the property '{{name}}'
+ */
+ @Test
+ public void {{name}}Test() {
+ // TODO: test {{name}}
+ }
+
+ {{/allVars}}
+ {{/vendorExtensions.x-is-one-of-interface}}
+ {{/model}}
+ {{/models}}
+}
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/openapi.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/openapi.mustache
new file mode 100644
index 00000000000..51ebafb0187
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/openapi.mustache
@@ -0,0 +1 @@
+{{{openapi-yaml}}}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/package-info.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/package-info.mustache
new file mode 100644
index 00000000000..c0a6d4bbb92
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/package-info.mustache
@@ -0,0 +1 @@
+package {{invokerPackage}};
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/java-helidon/server/settings.gradle.mustache b/modules/openapi-generator/src/main/resources/java-helidon/server/settings.gradle.mustache
new file mode 100644
index 00000000000..448dc07602e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/java-helidon/server/settings.gradle.mustache
@@ -0,0 +1 @@
+rootProject.name = '{{artifactId}}'
\ No newline at end of file
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonCommonCodegenPackagePrefixTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonCommonCodegenPackagePrefixTest.java
new file mode 100644
index 00000000000..d55c062f7e7
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonCommonCodegenPackagePrefixTest.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openapitools.codegen.java.helidon;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.openapitools.codegen.CodegenConstants;
+import org.openapitools.codegen.DefaultGenerator;
+import org.openapitools.codegen.TestUtils;
+import org.openapitools.codegen.config.CodegenConfigurator;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class JavaHelidonCommonCodegenPackagePrefixTest {
+
+ private static final String INPUT_FILE = "src/test/resources/3_0/helidon/petstore-for-testing.yaml";
+ private static final String PACKAGE_PREFIX_KEY = "rootJavaEEPackage";
+ private static final String HELIDON_VERSION_KEY = "helidonVersion";
+
+ private static final String EXCEPTION_MESSAGE_FRAGMENT = "namespace but options specified";
+
+ // The generated SE client does not depend on the jakarta/javax imports, so no need to test it.
+ private static final List> GENERATOR_LIBRARY_PAIRS = new ArrayList>() {
+ {
+ add(listOf("java-helidon-client", "mp"));
+ add(listOf("java-helidon-server", "se"));
+ add(listOf("java-helidon-server", "mp"));
+ }
+ };
+
+ private String outputDir;
+
+ @BeforeMethod
+ public void setup() throws IOException {
+ File output = Files.createTempDirectory("test").toFile();
+ output.deleteOnExit();
+ outputDir = output.getAbsolutePath().replace('\\', '/');
+ }
+
+ @Test(dataProvider = "valid")
+ public void checkValidCombinations(String explicitHelidonVersion,
+ String explicitPrefix,
+ String expectedPrefix,
+ String generatorName,
+ String libraryName) {
+ List files = runTest(explicitHelidonVersion, explicitPrefix, generatorName, libraryName);
+ checkFileForPackagePrefix(files, generatorName, libraryName, expectedPrefix);
+ }
+
+ @Test(dataProvider = "invalid")
+ public void checkInvalidCombinations(String explicitHelidonVersion,
+ String explicitPrefix,
+ String generatorName,
+ String libraryName) {
+ IllegalArgumentException e = Assert.assertThrows(IllegalArgumentException.class,
+ () -> runTest(explicitHelidonVersion, explicitPrefix, generatorName, libraryName));
+ Assert.assertTrue("Exception message '" + e.getMessage() + "' contains '" + EXCEPTION_MESSAGE_FRAGMENT + "'",
+ e.getMessage().contains(EXCEPTION_MESSAGE_FRAGMENT));
+ }
+
+ @DataProvider(name = "valid")
+ public Object [][] createValidData() {
+ Object [][] settingsForEachRun = new Object[][] {
+ {null, null, "jakarta"},
+ {"3.0.1", null, "jakarta"},
+ {"2.5.3", null, "javax"},
+ {null, "jakarta", "jakarta"},
+ {"3.0.1", "jakarta", "jakarta"},
+ {"2.5.3", "javax", "javax"}
+ };
+
+ return prepareTestData(settingsForEachRun);
+ }
+
+ @DataProvider(name = "invalid")
+ public Object [][] createInvalidData() {
+ Object [][] settingsForEachRun = new Object[][] {
+ {"2.5.3", "jakarta"},
+ {null, "javax"},
+ {"3.0.1", "javax"}
+ };
+
+ return prepareTestData(settingsForEachRun);
+ }
+
+ /**
+ * Creates test data for each tested generator/library pair for all the version/prefix settings.
+ *
+ * @param settingsForEachRun version/prefix settings to test
+ * @return test data for driving a test method
+ */
+ private Object[][] prepareTestData(Object[][] settingsForEachRun) {
+ Object [][] result = new Object[GENERATOR_LIBRARY_PAIRS.size() * settingsForEachRun.length][];
+ int resultSlot = 0;
+
+ int settingsLength = settingsForEachRun[0].length;
+ for (List generatorLibraryPair : GENERATOR_LIBRARY_PAIRS) {
+ for (Object[] settings : settingsForEachRun) {
+ result[resultSlot] = Arrays.copyOf(settings, settingsLength + 2);
+ result[resultSlot][settingsLength] = generatorLibraryPair.get(0); // generator
+ result[resultSlot][settingsLength + 1] = generatorLibraryPair.get(1); // library
+ resultSlot++;
+ }
+ }
+ return result;
+ }
+
+ private static List listOf(String... values) {
+ return new ArrayList<>(Arrays.asList(values));
+ }
+
+ private List runTest(String explicitHelidonVersion,
+ String explicitPackagePrefix,
+ String generatorName,
+ String libraryName) {
+ Map additionalProperties = new HashMap<>();
+ CodegenConfigurator clientConfigurator = new CodegenConfigurator()
+ .setGeneratorName(generatorName)
+ .setLibrary(libraryName)
+ .setInputSpec(INPUT_FILE)
+ .setOutputDir(outputDir);
+
+ if (explicitHelidonVersion != null) {
+ additionalProperties.put(HELIDON_VERSION_KEY, explicitHelidonVersion);
+ }
+ if (explicitPackagePrefix != null) {
+ additionalProperties.put(PACKAGE_PREFIX_KEY, explicitPackagePrefix);
+ }
+
+ // Use JSON-B for serialization to force jakarta or json imports into the generated POJOs.
+ additionalProperties.put(CodegenConstants.SERIALIZATION_LIBRARY, "jsonb");
+
+ clientConfigurator.setAdditionalProperties(additionalProperties);
+
+ DefaultGenerator generator = new DefaultGenerator();
+ generator.opts(clientConfigurator.toClientOptInput());
+
+ return generator.generate();
+ }
+
+ private void checkFileForPackagePrefix(List files,
+ String generatorName,
+ String libraryName,
+ String expectedPrefix) {
+ // The SE client does not use the rootJavaEEPackage so we don't check any file in that case.
+ if (generatorName.equals("java-helidon-client") && libraryName.equals("se")) {
+ return;
+ }
+
+ // The MP client and server generator create PetAPI containing a wildcard include.
+ if (libraryName.equals("mp")) {
+ TestUtils.ensureContainsFile(files, Paths.get(outputDir).toFile(), generatedFilePath(generatorName, libraryName));
+ TestUtils.assertFileContains(Paths.get(outputDir + "/" + generatedFilePath(generatorName, libraryName)),
+ "import " + expectedPrefix + ".ws.rs.*;");
+ return;
+ }
+
+ // The SE server generates 'import {{rootJavaEEPackage}}.json.stream.JsonParser;' in POJOs for JSON-B seriolization.
+ TestUtils.ensureContainsFile(files, Paths.get(outputDir).toFile(), generatedFilePath(generatorName, libraryName));
+ TestUtils.assertFileContains(Paths.get(outputDir + "/" + generatedFilePath(generatorName, libraryName)),
+ "import " + expectedPrefix + ".json.stream.JsonParser;");
+ }
+
+ private String generatedFilePath(String generatorName, String libraryName) {
+ // The path to the file depends on client or server.
+ String serverOrClient = (generatorName.contains("server") ? "server" : "client");
+
+ // The file to check depends on the generator: e.g., PetApi for client, PetService for server.
+ String apiFileNameSuffix = (generatorName.contains("server") ? "Service" : "Api");
+
+ // For MP, check api/PetApi or api/PetService; for SE check model/Pet.java.
+ String filePath = (libraryName.equals("mp")
+ ? "api/Pet" + apiFileNameSuffix
+ : "model/Pet")
+ + ".java";
+
+ return "src/main/java/org/openapitools/"
+ + serverOrClient
+ + "/"
+ + filePath;
+ }
+
+}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonCommonCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonCommonCodegenTest.java
new file mode 100644
index 00000000000..c92b404c09d
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonCommonCodegenTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openapitools.codegen.java.helidon;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.openapitools.codegen.CodegenConstants;
+import org.openapitools.codegen.DefaultGenerator;
+import org.openapitools.codegen.TestUtils;
+import org.openapitools.codegen.config.CodegenConfigurator;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+public class JavaHelidonCommonCodegenTest {
+
+ private DefaultGenerator generator;
+ private CodegenConfigurator configurator;
+ private String outputDir;
+
+ @BeforeMethod
+ public void setup() throws IOException {
+ File output = Files.createTempDirectory("test").toFile();
+ output.deleteOnExit();
+ outputDir = output.getAbsolutePath().replace('\\', '/');
+
+ configurator = new CodegenConfigurator()
+ .setGeneratorName("java-helidon-server")
+ .setLibrary("mp")
+ .setInputSpec("src/test/resources/3_0/helidon/petstore-for-testing.yaml")
+ .setOutputDir(outputDir);
+
+ generator = new DefaultGenerator();
+ }
+
+ @Test
+ public void defaultVersionTest() {
+ runVersionTest(null, null);
+ }
+
+ @Test
+ public void customHelidonVersionOnlyTest() {
+ runVersionTest("3.0.0", null);
+ }
+
+ @Test
+ public void customParentVersionOnlyTest() {
+ runVersionTest(null, "3.0.0");
+ }
+
+ @Test
+ public void bothEqualsVersionTest() {
+ runVersionTest("3.0.0", "3.0.0");
+ }
+
+ @Test
+ public void bothNotEqualsVersionTest() {
+ IllegalArgumentException e = Assert.assertThrows(IllegalArgumentException.class,() -> runVersionTest("1.0.0", "2.0.0"));
+ Assert.assertEquals(
+ "Both parentVersion and helidonVersion properties were set with different value.",
+ e.getMessage());
+ }
+
+ private void runVersionTest(String helidonVersion, String parentVersion) {
+ Map additionalProperties = new HashMap<>();
+ String expected = "3.0.1";
+ if (parentVersion != null) {
+ additionalProperties.put(CodegenConstants.PARENT_VERSION, parentVersion);
+ expected = parentVersion;
+ }
+ if (helidonVersion != null) {
+ additionalProperties.put("helidonVersion", helidonVersion);
+ expected = helidonVersion;
+ }
+ generator.opts(configurator.setAdditionalProperties(additionalProperties)
+ .toClientOptInput());
+ List files = generator.generate();
+
+ TestUtils.ensureContainsFile(files, Paths.get(outputDir).toFile(), "pom.xml");
+ TestUtils.assertFileContains(Paths.get(outputDir + "/pom.xml"),
+ String.format(Locale.ROOT, "%s", expected));
+ }
+
+}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonMpClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonMpClientCodegenTest.java
new file mode 100644
index 00000000000..3cecbf9b605
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonMpClientCodegenTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openapitools.codegen.java.helidon;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.openapitools.codegen.ClientOptInput;
+import org.openapitools.codegen.DefaultGenerator;
+import org.openapitools.codegen.TestUtils;
+import org.openapitools.codegen.config.CodegenConfigurator;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import static org.openapitools.codegen.java.assertions.JavaFileAssert.assertThat;
+
+public class JavaHelidonMpClientCodegenTest {
+
+ private String outputPath;
+ private List generatedFiles;
+
+ @BeforeClass
+ public void setup() throws IOException {
+ File output = Files.createTempDirectory("test").toFile();
+ output.deleteOnExit();
+ outputPath = output.getAbsolutePath().replace('\\', '/');
+
+ System.out.println("Generating java-helidon-client MP project in " + outputPath);
+
+ final CodegenConfigurator configurator = new CodegenConfigurator()
+ .setGeneratorName("java-helidon-client")
+ .setLibrary("mp")
+ .setInputSpec("src/test/resources/3_0/helidon/petstore-no-multipart-for-testing.yaml")
+ .setOutputDir(outputPath);
+
+ final ClientOptInput clientOptInput = configurator.toClientOptInput();
+ DefaultGenerator generator = new DefaultGenerator();
+ generator.opts(clientOptInput);
+ generatedFiles = generator.generate();
+ }
+
+ @Test
+ public void testPom() {
+ TestUtils.ensureContainsFile(generatedFiles, new File(outputPath), "pom.xml");
+ }
+
+ @Test
+ public void testPetApi() {
+ assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/client/api/PetApi.java"))
+ .assertMethod("addPet", "Pet")
+ .toFileAssert()
+ .assertMethod("deletePet", "Long", "String", "Long", "String", "Integer",
+ "List", "List")
+ .toFileAssert()
+ .assertMethod("findPetsByStatus", "List")
+ .toFileAssert()
+ .assertMethod("findPetsByTags", "List")
+ .toFileAssert()
+ .assertMethod("getPetById", "Long")
+ .toFileAssert()
+ .assertMethod("updatePet", "Pet")
+ .toFileAssert()
+ .assertMethod("updatePetWithForm", "Long", "String", "String")
+ .toFileAssert();
+ }
+
+ @Test
+ public void testStoreApi() {
+ assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/client/api/StoreApi.java"))
+ .assertMethod("deleteOrder", "String")
+ .toFileAssert()
+ .assertMethod("getInventory")
+ .toFileAssert()
+ .assertMethod("getOrderById", "BigDecimal")
+ .toFileAssert()
+ .assertMethod("placeOrder", "Order")
+ .toFileAssert();
+ }
+
+ @Test
+ public void testUserApi() {
+ assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/client/api/UserApi.java"))
+ .assertMethod("createUser", "User")
+ .toFileAssert()
+ .assertMethod("createUsersWithArrayInput", "List")
+ .toFileAssert()
+ .assertMethod("createUsersWithListInput", "List")
+ .toFileAssert()
+ .assertMethod("getUserByName", "String")
+ .toFileAssert()
+ .assertMethod("loginUser", "String", "String", "String", "Long", "BigDecimal")
+ .toFileAssert()
+ .assertMethod("updateUser", "String", "User")
+ .toFileAssert();
+ }
+}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonMpServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonMpServerCodegenTest.java
new file mode 100644
index 00000000000..312d2f9d855
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonMpServerCodegenTest.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openapitools.codegen.java.helidon;
+
+import org.openapitools.codegen.DefaultGenerator;
+import org.openapitools.codegen.TestUtils;
+import org.openapitools.codegen.config.CodegenConfigurator;
+import org.openapitools.codegen.java.assertions.JavaFileAssert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import static org.openapitools.codegen.CodegenConstants.SERIALIZATION_LIBRARY;
+
+public class JavaHelidonMpServerCodegenTest {
+
+ private DefaultGenerator generator;
+ private String outputPath;
+ private String apiPackage;
+ private String modelPackage;
+
+ @BeforeMethod
+ public void setup() throws IOException {
+ File output = Files.createTempDirectory("test").toFile();
+ output.deleteOnExit();
+ outputPath = output.getAbsolutePath().replace('\\', '/');
+ apiPackage = outputPath + "/src/main/java/org/openapitools/server/api";
+ modelPackage = outputPath + "/src/main/java/org/openapitools/server/model";
+ generator = new DefaultGenerator();
+ }
+
+ private CodegenConfigurator createConfigurator() {
+ return new CodegenConfigurator()
+ .setGeneratorName("java-helidon-server")
+ .setLibrary("mp")
+ .setInputSpec("src/test/resources/3_0/helidon/petstore-for-testing.yaml")
+ .setOutputDir(outputPath);
+ }
+
+ private void generate(CodegenConfigurator config) {
+ generator.opts(config.toClientOptInput());
+ generator.setGenerateMetadata(false);
+ generator.generate();
+ }
+
+ private void generate() {
+ generate(createConfigurator());
+ }
+
+ @Test
+ public void testRestApiFilesOnly() {
+ generate(createConfigurator().addAdditionalProperty("fullProject", "false"));
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/PetService.java"))
+ .fileContains("public interface PetService");
+
+ File outputFile = Paths.get(outputPath).toFile();
+ assertThat(Objects.requireNonNull(outputFile.listFiles()).length, is(1));
+ }
+
+ @Test
+ public void testJackson() {
+ generate(createConfigurator().addAdditionalProperty(SERIALIZATION_LIBRARY, "jackson"));
+
+ JavaFileAssert.assertThat(Paths.get(modelPackage + "/Color.java"))
+ .fileContains("com.fasterxml.jackson.annotation.JsonCreator")
+ .fileContains("com.fasterxml.jackson.annotation.JsonValue");
+ }
+
+ @Test
+ public void testJsonb() {
+ generate(createConfigurator().addAdditionalProperty(SERIALIZATION_LIBRARY, "jsonb"));
+
+ JavaFileAssert.assertThat(Paths.get(modelPackage + "/Color.java"))
+ .fileContains(".json.bind.annotation.JsonbCreator");
+ }
+
+ @Test
+ public void testAbstractClass() {
+ generate(createConfigurator().addAdditionalProperty("useAbstractClass", "true"));
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/PetService.java"))
+ .fileContains("public abstract class PetService")
+ .assertMethod("addPet", "Pet")
+ .doesNotHaveImplementation();
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/StoreService.java"))
+ .fileContains("public abstract class StoreService")
+ .assertMethod("placeOrder", "Order")
+ .doesNotHaveImplementation()
+ .hasReturnType("Order");
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/StoreServiceImpl.java"))
+ .fileContains("public class StoreServiceImpl extends StoreService")
+ .assertMethod("placeOrder", "Order")
+ .hasReturnType("Order")
+ .bodyContainsLines("Order result = null; // Replace with correct business logic.", "return result;");
+ }
+
+ @Test
+ public void testFullProject() {
+ generate(createConfigurator().addAdditionalProperty("fullProject", "true"));
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/PetService.java"))
+ .fileContains("public interface PetService")
+ .assertMethod("addPet", "Pet");
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/StoreService.java"))
+ .fileContains("public interface StoreService")
+ .assertMethod("placeOrder", "Order")
+ .hasReturnType("Order");
+ }
+
+ @Test
+ public void validatePetApi() {
+ generate();
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/PetService.java"))
+ .fileContains("org.openapitools.server.model.Pet")
+ .assertMethod("addPet", "Pet")
+ .toFileAssert()
+ .assertMethod("addPets", "String", "InputStream", "InputStream", "List", "List", "Integer")
+ .toFileAssert()
+ .assertMethod("deletePet", "Long", "String", "Long", "String", "Integer", "List", "List")
+ .toFileAssert()
+ .assertMethod("findPetsByStatus", "List")
+ .toFileAssert()
+ .assertMethod("findPetsByTags", "List")
+ .toFileAssert()
+ .assertMethod("getPetById", "Long")
+ .toFileAssert()
+ .assertMethod("updatePet", "Pet")
+ .toFileAssert()
+ .assertMethod("updatePetWithForm", "Long", "String", "String")
+ .toFileAssert()
+ .assertMethod("uploadFile", "Long", "Long", "String", "InputStream");
+ }
+
+ @Test
+ public void validateStoreApi() {
+ generate();
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/StoreService.java"))
+ .fileContains("org.openapitools.server.model.Order")
+ .assertMethod("deleteOrder", "String")
+ .toFileAssert()
+ .assertMethod("getInventory")
+ .toFileAssert()
+ .assertMethod("getOrderById", "BigDecimal")
+ .toFileAssert()
+ .assertMethod("placeOrder", "Order");
+ }
+
+ @Test
+ public void validateUserApi() {
+ generate();
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/UserService.java"))
+ .fileContains("org.openapitools.server.model.User")
+ .assertMethod("createUser", "User")
+ .toFileAssert()
+ .assertMethod("createUsersWithArrayInput", "List")
+ .toFileAssert()
+ .assertMethod("createUsersWithListInput", "List")
+ .toFileAssert()
+ .assertMethod("deleteUser", "String")
+ .toFileAssert()
+ .assertMethod("getUserByName", "String")
+ .toFileAssert()
+ .assertMethod("loginUser", "String", "String", "String", "Long", "BigDecimal")
+ .toFileAssert()
+ .assertMethod("logoutUser")
+ .toFileAssert()
+ .assertMethod("updateUser", "String", "User");
+ }
+
+ @Test
+ public void testGenerateGradleProject() {
+ generate(createConfigurator().addAdditionalProperty("gradleProject", "true"));
+
+ assertThat(Paths.get(outputPath + "/build.gradle").toFile().exists(), is(true));
+ assertThat(Paths.get(outputPath + "/settings.gradle").toFile().exists(), is(true));
+ TestUtils.assertFileNotExists(Paths.get(outputPath + "/pom.xml"));
+ }
+
+ @Test
+ public void testReturnResponse() {
+ generate(createConfigurator().addAdditionalProperty("returnResponse", "true"));
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/PetService.java"))
+ .fileContains("public interface PetService")
+ .assertMethod("addPet", "Pet")
+ .hasReturnType("Response");
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/PetService.java"))
+ .fileContains("public interface PetService")
+ .assertMethod("deletePet", "Long", "String", "Long", "String", "Integer", "List", "List")
+ .hasReturnType("Response");
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/PetServiceImpl.java"))
+ .fileContains("public class PetServiceImpl implements PetService")
+ .assertMethod("addPet", "Pet")
+ .hasReturnType("Response")
+ .bodyContainsLines("return Response.ok(/* Pass Pet entity payload */).build(); "
+ + "// Replace with correct business logic.");
+ }
+
+ @Test
+ public void testSupportAsync() {
+ generate(createConfigurator().addAdditionalProperty("supportAsync", "true"));
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/PetService.java"))
+ .fileContains("public interface PetService")
+ .assertMethod("addPet", "Pet")
+ .hasReturnType("CompletionStage");
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/PetService.java"))
+ .fileContains("public interface PetService")
+ .assertMethod("deletePet", "Long", "String", "Long", "String", "Integer", "List", "List")
+ .hasReturnType("CompletionStage");
+
+ JavaFileAssert.assertThat(Paths.get(apiPackage + "/PetServiceImpl.java"))
+ .fileContains("public class PetServiceImpl implements PetService")
+ .assertMethod("addPet", "Pet")
+ .hasReturnType("CompletionStage")
+ .bodyContainsLines("Pet result = null; // Replace with correct business logic.",
+ "return CompletableFuture.supplyAsync(() -> result);");
+ }
+
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonSeClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonSeClientCodegenTest.java
new file mode 100644
index 00000000000..61e49d79f8f
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonSeClientCodegenTest.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openapitools.codegen.java.helidon;
+
+import org.openapitools.codegen.ClientOptInput;
+import org.openapitools.codegen.DefaultGenerator;
+import org.openapitools.codegen.TestUtils;
+import org.openapitools.codegen.config.CodegenConfigurator;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+
+import static org.openapitools.codegen.java.assertions.JavaFileAssert.assertThat;
+
+public class JavaHelidonSeClientCodegenTest {
+
+ private String outputPath;
+ private List generatedFiles;
+
+ @BeforeClass
+ public void setup() throws IOException {
+ File output = Files.createTempDirectory("test").toFile();
+ output.deleteOnExit();
+ outputPath = output.getAbsolutePath().replace('\\', '/');
+
+ System.out.println("Generating java-helidon-client SE project in " + outputPath);
+
+ final CodegenConfigurator configurator = new CodegenConfigurator()
+ .setGeneratorName("java-helidon-client")
+ .setLibrary("se")
+ .setInputSpec("src/test/resources/3_0/helidon/petstore-no-multipart-for-testing.yaml")
+ .setOutputDir(outputPath);
+
+ final ClientOptInput clientOptInput = configurator.toClientOptInput();
+ DefaultGenerator generator = new DefaultGenerator();
+ generator.opts(clientOptInput);
+ generatedFiles = generator.generate();
+ }
+
+ @DataProvider(name = "fileSuffix")
+ public Object[][] fileSuffixes() {
+ return new Object[][] {
+ {""},
+ {"Impl"}
+ };
+ }
+
+ @Test
+ public void testPom() {
+ TestUtils.ensureContainsFile(generatedFiles, new File(outputPath), "pom.xml");
+ }
+
+ @Test(dataProvider = "fileSuffix")
+ public void testPetApi(String fileSuffix) {
+ assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/client/api/PetApi" + fileSuffix + ".java"))
+ .assertMethod("addPet", "Pet")
+ .toFileAssert()
+ .assertMethod("deletePet", "Long", "String", "Long", "String", "Integer",
+ "List", "List")
+ .toFileAssert()
+ .assertMethod("findPetsByStatus", "List")
+ .toFileAssert()
+ .assertMethod("findPetsByTags", "List")
+ .toFileAssert()
+ .assertMethod("getPetById", "Long")
+ .toFileAssert()
+ .assertMethod("updatePet", "Pet")
+ .toFileAssert()
+ .assertMethod("updatePetWithForm", "Long", "String", "String")
+ .toFileAssert();
+ }
+
+ @Test(dataProvider = "fileSuffix")
+ public void testStoreApi(String fileSuffix) {
+ assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/client/api/StoreApi" + fileSuffix + ".java"))
+ .assertMethod("deleteOrder", "String")
+ .toFileAssert()
+ .assertMethod("getInventory")
+ .toFileAssert()
+ .assertMethod("getOrderById", "BigDecimal")
+ .toFileAssert()
+ .assertMethod("placeOrder", "Order")
+ .toFileAssert();
+ }
+
+ @Test(dataProvider = "fileSuffix")
+ public void testUserApi(String fileSuffix) {
+ assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/client/api/UserApi" + fileSuffix + ".java"))
+ .assertMethod("createUser", "User")
+ .toFileAssert()
+ .assertMethod("createUsersWithArrayInput", "List")
+ .toFileAssert()
+ .assertMethod("createUsersWithListInput", "List")
+ .toFileAssert()
+ .assertMethod("getUserByName", "String")
+ .toFileAssert()
+ .assertMethod("loginUser", "String", "String", "String", "Long", "BigDecimal")
+ .toFileAssert()
+ .assertMethod("updateUser", "String", "User")
+ .toFileAssert();
+ }
+}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonSeServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonSeServerCodegenTest.java
new file mode 100644
index 00000000000..0e415b83869
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/JavaHelidonSeServerCodegenTest.java
@@ -0,0 +1,305 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openapitools.codegen.java.helidon;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.openapitools.codegen.ClientOptInput;
+import org.openapitools.codegen.DefaultGenerator;
+import org.openapitools.codegen.Generator;
+import org.openapitools.codegen.TestUtils;
+import org.openapitools.codegen.config.CodegenConfigurator;
+import org.openapitools.codegen.java.assertions.JavaFileAssert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertTrue;
+
+public class JavaHelidonSeServerCodegenTest {
+
+ private DefaultGenerator generator;
+ private String outputPath;
+
+ @BeforeMethod
+ public void setup() throws IOException {
+ File output = Files.createTempDirectory("test").toFile();
+ output.deleteOnExit();
+ outputPath = output.getAbsolutePath().replace('\\', '/');
+
+ final CodegenConfigurator configurator = codegenConfigurator(new HashMap<>());
+
+ final ClientOptInput clientOptInput = configurator.toClientOptInput();
+ generator = new DefaultGenerator();
+ generator.opts(clientOptInput);
+ }
+
+ private CodegenConfigurator codegenConfigurator(Map additionalProperties) {
+ return new CodegenConfigurator()
+ .setGeneratorName("java-helidon-server")
+ .setLibrary("se")
+ .setAdditionalProperties(additionalProperties)
+ .setInputSpec("src/test/resources/3_0/helidon/petstore-for-testing.yaml")
+ .setOutputDir(outputPath);
+ }
+
+
+ @Test
+ public void testGenerateFullProject() {
+ generator.generate();
+
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/api/PetServiceImpl.java"))
+ .fileContains(
+ "public class PetServiceImpl",
+ "response.status(HTTP_CODE_NOT_IMPLEMENTED).send();"
+ );
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/Main.java"))
+ .fileContains(
+ "import org.openapitools.server.api.PetServiceImpl;",
+ ".register(\"/\", new PetServiceImpl())"
+ );
+ }
+
+ @Test
+ public void testGenerateProjectByDefault() {
+ generator.generate();
+
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/api/PetService.java"))
+ .fileContains(
+ "public interface PetService extends Service {",
+ "default void update(Routing.Rules rules) {",
+ "void addPet(ServerRequest request, ServerResponse response, Pet pet);",
+ "void deletePet(ServerRequest request, ServerResponse response);"
+ );
+ TestUtils.assertFileNotExists(Paths.get(outputPath + "/build.gradle"));
+ TestUtils.assertFileNotExists(Paths.get(outputPath + "/settings.gradle"));
+ }
+
+ @Test
+ public void testGenerateGradleProject() {
+ Map additionalProperties = new HashMap<>();
+ additionalProperties.put("gradleProject", true);
+ final CodegenConfigurator configurator = codegenConfigurator(additionalProperties);
+ generator.opts(configurator.toClientOptInput()).generate();
+
+ assertTrue(Paths.get(outputPath + "/build.gradle").toFile().exists());
+ assertTrue(Paths.get(outputPath + "/settings.gradle").toFile().exists());
+ TestUtils.assertFileNotExists(Paths.get(outputPath + "/pom.xml"));
+ }
+
+ @Test
+ public void testGeneratePathParams() throws IOException {
+ Map additionalProperties = new HashMap<>();
+ additionalProperties.put("useAbstractClass", true);
+ final CodegenConfigurator configurator = codegenConfigurator(additionalProperties);
+ generator.opts(configurator.toClientOptInput()).generate();
+
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/api/PetService.java"))
+ .assertMethod("deletePet", "ServerRequest", "ServerResponse")
+ .bodyContainsLines(
+ "Long petId = Optional.ofNullable(request.path().param(\"petId\")).map(Long::valueOf).orElse" +
+ "(null);",
+ "ValidatorUtils.checkNonNull(petId);"
+ )
+ .toFileAssert()
+ .assertMethod("getPetById")
+ .bodyContainsLines(
+ "Long petId = Optional.ofNullable(request.path().param(\"petId\")).map(Long::valueOf).orElse" +
+ "(null);",
+ "ValidatorUtils.checkNonNull(petId);"
+ );
+ }
+
+ @Test
+ public void testGenerateQueryParams() throws IOException {
+ Map additionalProperties = new HashMap<>();
+ additionalProperties.put("useAbstractClass", true);
+ final CodegenConfigurator configurator = codegenConfigurator(additionalProperties);
+ generator.opts(configurator.toClientOptInput()).generate();
+
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/api/PetService.java"))
+ .fileContains("import java.util.List;")
+ .assertMethod("findPetsByTags")
+ .bodyContainsLines(
+ "List tags = Optional.ofNullable(request.queryParams().toMap().get(\"tags\"))" +
+ ".orElse(null);",
+ "ValidatorUtils.checkNonNull(tags);"
+ )
+ .toFileAssert()
+ .assertMethod("findPetsByStatus")
+ .bodyContainsLines(
+ "List status = Optional.ofNullable(request.queryParams().toMap().get(\"status\")).orElse" +
+ "(null);",
+ "ValidatorUtils.checkNonNull(status);"
+ );
+ }
+
+ @Test
+ public void testGenerateBodyParams() throws IOException {
+ Map additionalProperties = new HashMap<>();
+ additionalProperties.put("useAbstractClass", true);
+ final CodegenConfigurator configurator = codegenConfigurator(additionalProperties);
+ generator.opts(configurator.toClientOptInput()).generate();
+
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/api/PetService.java"))
+ .assertMethod("update")
+ .bodyContainsLines(
+ "rules.post(\"/pet\", Handler.create(Pet.class, this::addPet));",
+ "rules.put(\"/pet\", Handler.create(Pet.class, this::updatePet));"
+ )
+ .toFileAssert()
+ .assertMethod("addPet", "ServerRequest", "ServerResponse", "Pet")
+ .bodyContainsLines(
+ "ValidatorUtils.checkNonNull(pet);",
+ "handleAddPet(request, response, pet);"
+ )
+ .toFileAssert()
+ .assertMethod("updatePet", "ServerRequest", "ServerResponse", "Pet")
+ .bodyContainsLines(
+ "ValidatorUtils.checkNonNull(pet);",
+ "handleUpdatePet(request, response, pet);"
+ );
+
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/api/UserService.java"))
+ .assertMethod("update")
+ .bodyContainsLines(
+ "rules.post(\"/user\", Handler.create(User.class, this::createUser));",
+ "rules.post(\"/user/createWithArray\", this::createUsersWithArrayInput);",
+ "rules.post(\"/user/createWithList\", this::createUsersWithListInput);",
+ "rules.put(\"/user/{username}\", Handler.create(User.class, this::updateUser));"
+ )
+ .toFileAssert()
+ .assertMethod("createUser", "ServerRequest", "ServerResponse", "User")
+ .bodyContainsLines(
+ "ValidatorUtils.checkNonNull(user);",
+ "handleCreateUser(request, response, user);"
+ )
+ .toFileAssert()
+ .assertMethod("createUsersWithArrayInput", "ServerRequest", "ServerResponse")
+ .bodyContainsLines(
+ "Single.create(request.content().as(new GenericType>() { }))",
+ ".thenAccept(user -> {",
+ "ValidatorUtils.checkNonNull(user);",
+ "handleCreateUsersWithArrayInput(request, response, user);",
+ ".exceptionally(throwable -> handleError(request, response, throwable));"
+ );
+ }
+
+ @Test
+ public void testGenerateHeaderParams() throws IOException {
+ Map additionalProperties = new HashMap<>();
+ additionalProperties.put("useAbstractClass", true);
+ final CodegenConfigurator configurator = codegenConfigurator(additionalProperties);
+ generator.opts(configurator.toClientOptInput()).generate();
+
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/api/PetService.java"))
+ .assertMethod("deletePet", "ServerRequest", "ServerResponse")
+ .bodyContainsLines(
+ "String apiKey = request.headers().value(\"api_key\").orElse(null);",
+ "Long headerLong = request.headers().value(\"headerLong\").map(Long::valueOf).orElse(null);",
+ "ValidatorUtils.checkNonNull(headerLong);"
+ );
+ }
+
+ @Test
+ public void testGenerateCookiesParams() throws IOException {
+ Map additionalProperties = new HashMap<>();
+ additionalProperties.put("useAbstractClass", true);
+ final CodegenConfigurator configurator = codegenConfigurator(additionalProperties);
+ generator.opts(configurator.toClientOptInput()).generate();
+
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/api/PetService.java"))
+ .assertMethod("deletePet", "ServerRequest", "ServerResponse")
+ .bodyContainsLines(
+ "String cookieString = request.headers().cookies().toMap().getOrDefault(\"cookieString\", List.of" +
+ "()).stream().findFirst().orElse(null);",
+ "ValidatorUtils.checkNonNull(cookieString);",
+ "Integer cookieInt = request.headers().cookies().toMap().getOrDefault(\"cookieInt\", List.of())" +
+ ".stream().findFirst().map(Integer::valueOf).orElse(null);",
+ "List cookieIntArray = Optional.ofNullable(request.headers().cookies().toMap().get" +
+ "(\"cookieIntArray\")).orElse(null);",
+ "List cookieStringArray = Optional.ofNullable(request.headers().cookies().toMap().get" +
+ "(\"cookieStringArray\")).orElse(null);"
+ );
+ }
+
+ @Test
+ public void testGenerateFormParams() throws IOException {
+ Map additionalProperties = new HashMap<>();
+ additionalProperties.put("useAbstractClass", true);
+ final CodegenConfigurator configurator = codegenConfigurator(additionalProperties);
+ generator.opts(configurator.toClientOptInput()).generate();
+
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/api/PetService.java"))
+ .assertMethod("addPets", "ServerRequest", "ServerResponse")
+ .bodyContainsLines(
+ "Map> nonFileFormContent = new HashMap<>();",
+ "Map> fileFormContent = new HashMap<>();",
+ " Single formSingle = request.content().asStream(ReadableBodyPart.class)",
+ "if (\"images[]\".equals(name)) {",
+ "processFileFormField(name, fileFormContent, part);",
+ "if (\"image\".equals(name)) {",
+ "if (\"titles[]\".equals(name)) {",
+ "processNonFileFormField(name, nonFileFormContent, part);",
+ "if (\"longArray\".equals(name)) {",
+ "if (\"stringParam\".equals(name)) {",
+ "if (\"intParam\".equals(name)) {",
+ "List images = Optional.ofNullable(fileFormContent.get(\"images[]\")).orElse(null);",
+ "InputStream image = Optional.ofNullable(fileFormContent.get(\"image\")).flatMap(list->list" +
+ ".stream().findFirst()).orElse(null);",
+ "List titles = Optional.ofNullable(nonFileFormContent.get(\"titles[]\")).orElse(null);",
+ "List longArray = Optional.ofNullable(nonFileFormContent.get(\"longArray\")).orElse(null);",
+ "Integer intParam = Optional.ofNullable(nonFileFormContent.get(\"intParam\")).flatMap(list->list" +
+ ".stream().findFirst()).map(Integer::valueOf).orElse(null);"
+ );
+ }
+
+ @Test
+ public void testGenerateParamsValidation() throws IOException {
+ Map additionalProperties = new HashMap<>();
+ additionalProperties.put("useAbstractClass", true);
+ final CodegenConfigurator configurator = codegenConfigurator(additionalProperties);
+ generator.opts(configurator.toClientOptInput()).generate();
+
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/api/PetService.java"))
+ .assertMethod("findPetsByStatus")
+ .bodyContainsLines(
+ "ValidatorUtils.checkNonNull(status);",
+ "List status = Optional.ofNullable(request.queryParams().toMap().get(\"status\")).orElse" +
+ "(null);"
+ )
+ .toFileAssert()
+ .assertMethod("findPetsByTags")
+ .bodyContainsLines(
+ "List tags = Optional.ofNullable(request.queryParams().toMap().get(\"tags\")).orElse" +
+ "(null);",
+ "ValidatorUtils.checkNonNull(tags);"
+ );
+
+ JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/server/api/UserService.java"))
+ .assertMethod("loginUser")
+ .bodyContainsLines(
+ "ValidatorUtils.validatePattern(username, \"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\" +
+ ".\\\\-_]*[a-zA-Z0-9]+$\");",
+ ""
+ );
+ }
+}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalBase.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalBase.java
new file mode 100644
index 00000000000..15c858f4352
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalBase.java
@@ -0,0 +1,361 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openapitools.codegen.java.helidon.functional;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UncheckedIOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.AbstractMap;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+import org.openapitools.codegen.DefaultGenerator;
+import org.openapitools.codegen.config.CodegenConfigurator;
+import org.openapitools.codegen.languages.JavaHelidonCommonCodegen;
+import org.testng.SkipException;
+
+import static java.util.Objects.requireNonNull;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+abstract class FunctionalBase {
+
+ private static final Logger LOGGER = Logger.getLogger(FunctionalBase.class.getName());
+
+ private static final String MAVEN_SHIM_TARGET = "libexec/bin/mvn";
+ private static final String MAVEN_HOME_VAR = "MAVEN_HOME";
+ private static final String MVN_HOME_VAR = "MVN_HOME";
+ private static final String PATH_VAR = "PATH";
+ private static final String MAVEN_BINARY_NAME;
+ private static final boolean IS_WINDOWS_OS;
+ private static final List> DEFAULT_HELIDON_VERSIONS_FOR_JAVA_VERSIONS = new ArrayList<>();
+
+ protected static final String FULL_PROJECT = "fullProject";
+ protected static final String USE_ABSTRACT_CLASS = "useAbstractClass";
+
+ static {
+ /*
+ The inferred Helidon version for tests is from the entry for which the Java major version does not exceed
+ the current runtime Java major version.
+
+ For example, for Java 8 or 9 or 11: 2.5.3. For Java 13 or later: 3.0.1.
+ */
+ DEFAULT_HELIDON_VERSIONS_FOR_JAVA_VERSIONS.add(new AbstractMap.SimpleEntry<>(11, "2.5.3"));
+ DEFAULT_HELIDON_VERSIONS_FOR_JAVA_VERSIONS.add(new AbstractMap.SimpleEntry<>(13, "3.0.1"));
+ }
+
+ private String library;
+ private String generatorName;
+ private String inputSpec;
+ protected Path outputPath;
+
+ private Path mvn;
+
+ static {
+ IS_WINDOWS_OS = System.getProperty("os.name", "unknown")
+ .toLowerCase(Locale.ENGLISH)
+ .contains("win");
+ MAVEN_BINARY_NAME = IS_WINDOWS_OS ? "mvn.cmd" : "mvn";
+ }
+
+ protected CodegenConfigurator createConfigurator() {
+ try {
+ return createConfigurator(Files.createTempDirectory("test"));
+ } catch (IOException e) {
+ throw new UncheckedIOException("Can not create temp directory", e);
+ }
+ }
+
+ protected CodegenConfigurator createConfigurator(Path outputPath) {
+ Objects.requireNonNull(inputSpec);
+ this.outputPath = outputPath;
+ String sanitizedPath = outputPath.toFile()
+ .getAbsolutePath()
+ .replace('\\', '/');
+ return new CodegenConfigurator()
+ .setGeneratorName(generatorName)
+ .setLibrary(library)
+ .setInputSpec(inputSpec)
+ .setOutputDir(sanitizedPath);
+
+ }
+
+ protected void generate(CodegenConfigurator config) {
+ String helidonVersionToUse = chooseHelidonVersion(config);
+ enforceJavaVersion(helidonVersionToUse);
+ DefaultGenerator generator = new DefaultGenerator();
+ generator.opts(config.toClientOptInput());
+ generator.generate();
+ }
+
+ protected void generate() {
+ generate(createConfigurator());
+ }
+
+ protected void generate(String inputSpec) {
+ inputSpec(inputSpec);
+ generate(createConfigurator());
+ }
+
+ protected void generatorName(String generatorName) {
+ this.generatorName = generatorName;
+ }
+
+ protected void library(String library) {
+ this.library = library;
+ }
+
+ protected void inputSpec(String inputSpec) {
+ this.inputSpec = inputSpec;
+ }
+
+ /**
+ * Run maven command with provided arguments.
+ *
+ * @param args maven command arguments
+ * @return a {@link ProcessReader}
+ */
+ protected ProcessReader runMavenProcess(String... args) {
+ return runMavenProcess(outputPath.toFile(), args);
+ }
+
+ /**
+ * Run maven command and causes the current thread to wait for {@link Process} to terminate.
+ *
+ * @param args maven command arguments
+ * @return a {@link ProcessReader}
+ */
+ protected ProcessReader runMavenProcessAndWait(String... args) {
+ ProcessReader process = runMavenProcess(args);
+ process.waitFor(10, TimeUnit.MINUTES);
+ return process;
+ }
+
+ /**
+ * Run maven command in the provided directory.
+ *
+ * @param directory from where the command is executed
+ * @param args maven command arguments
+ * @return a {@link ProcessReader}
+ */
+ protected ProcessReader runMavenProcess(File directory, String... args) {
+ List command = new ArrayList<>(Collections.singleton(mavenExecutable()));
+ Collections.addAll(command, args);
+ try {
+ Process process = new ProcessBuilder()
+ .directory(directory)
+ .command(command)
+ .start();
+ return new ProcessReader(process);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+
+ /**
+ * Finds the {@code mvn} executable. Searches using the following, in order:
+ *
+ * - The {@code MAVEN_HOME} environment variable
+ * - The {@code MVN_HOME} environment variable
+ * - The {@code PATH} environment variable
+ *
+ *
+ * @return The path.
+ */
+ public String mavenExecutable() {
+ if (mvn == null) {
+ Path maven;
+ Optional path = findExecutableInPath();
+ if (path.isPresent()) {
+ maven = path.get();
+ } else {
+ maven = toMavenExecutable(MAVEN_HOME_VAR);
+ if (maven == null) {
+ maven = toMavenExecutable(MVN_HOME_VAR);
+ }
+ }
+ try {
+ assumeTrue( "Maven not found, test is skipped", maven != null);
+ maven = maven.toRealPath();
+ Path shimmed = maven.getParent().getParent().resolve(MAVEN_SHIM_TARGET);
+ if (Files.exists(shimmed)) {
+ maven = shimmed;
+ }
+ mvn = maven.toRealPath();
+ } catch (IOException ex) {
+ throw new IllegalStateException(ex.getMessage());
+ }
+ }
+ return mvn.toString();
+ }
+
+ private String chooseHelidonVersion(CodegenConfigurator config) {
+ Map unprocessedAdditionalProperties = config.toContext()
+ .getGeneratorSettings()
+ .getAdditionalProperties();
+ if (unprocessedAdditionalProperties.containsKey(JavaHelidonCommonCodegen.HELIDON_VERSION)) {
+ return unprocessedAdditionalProperties.get(JavaHelidonCommonCodegen.HELIDON_VERSION).toString();
+ }
+ String result = inferredHelidonVersion();
+ config.addAdditionalProperty(JavaHelidonCommonCodegen.HELIDON_VERSION, result);
+ return result;
+ }
+
+ private void enforceJavaVersion(String helidonVersionToUse) {
+ int currentJavaVersion = getCurrentJavaMajorVersion();
+ int requiredJavaVersion = getRequiredJavaVersion(helidonVersionToUse);
+ String errorJavaVersion = String.format(Locale.ROOT, "Java version must be %s, test is skipped", requiredJavaVersion);
+ assumeTrue(errorJavaVersion, currentJavaVersion == requiredJavaVersion);
+ }
+
+ private int getRequiredJavaVersion(String helidonVersionToUse) {
+ return helidonVersionToUse
+ .startsWith("3.") ? 17 : 11;
+ }
+
+ private int getCurrentJavaMajorVersion() {
+ String[] versionElements = System.getProperty("java.version").split("\\.");
+ int firstElement = Integer.parseInt(versionElements[0]);
+ if (firstElement == 1) {
+ return Integer.parseInt(versionElements[1]);
+ } else {
+ return firstElement;
+ }
+ }
+
+ private String inferredHelidonVersion() {
+ int javaMajorVersion = getCurrentJavaMajorVersion();
+ String result = null;
+ for (Map.Entry javaToHelidonVersionMapping : DEFAULT_HELIDON_VERSIONS_FOR_JAVA_VERSIONS) {
+ if (javaToHelidonVersionMapping.getKey() <= javaMajorVersion) {
+ result = javaToHelidonVersionMapping.getValue();
+ }
+ }
+ if (result == null) {
+ String message = String.format(Locale.ROOT, "Unable to infer Helidon version from current Java major version %d using mapping %s",
+ javaMajorVersion, DEFAULT_HELIDON_VERSIONS_FOR_JAVA_VERSIONS);
+ LOGGER.log(Level.WARNING, message);
+ throw new SkipException(message);
+ }
+ return result;
+ }
+
+ /**
+ * Find an executable in the {@code PATH} environment variable, if present.
+ *
+ * @return The path.
+ */
+ private Optional findExecutableInPath() {
+ return Arrays.stream(requireNonNull(System.getenv(PATH_VAR)).split(File.pathSeparator))
+ .map(Paths::get)
+ .map(path -> path.resolve(FunctionalBase.MAVEN_BINARY_NAME))
+ .filter(Files::isExecutable)
+ .findFirst();
+ }
+
+ private Path toMavenExecutable(String mavenHomeEnvVar) {
+ Path mavenHome = envVarPath(mavenHomeEnvVar);
+ if (mavenHome != null) {
+ if (Files.isDirectory(mavenHome)) {
+ Path executable = mavenHome.resolve("bin").resolve(MAVEN_BINARY_NAME);
+ if (Files.exists(executable) && (IS_WINDOWS_OS || Files.isExecutable(executable))) {
+ return executable;
+ }
+ }
+ }
+ return null;
+ }
+
+ private static Path envVarPath(String var) {
+ final String path = System.getenv(var);
+ return path == null ? null : Paths.get(path);
+ }
+
+ /**
+ * Allow junit to skip test without throwing an exception and report tests as failed.
+ *
+ * @param message warning message
+ * @param condition to be checked
+ */
+ protected static void assumeTrue(String message, boolean condition) {
+ if (!condition) {
+ LOGGER.log(Level.WARNING, message);
+ throw new SkipException(message);
+ }
+ }
+
+ /**
+ * Convenience method to build project using Maven and verify test output.
+ *
+ * @param jarPath path to expected jar file
+ */
+ protected void buildAndVerify(String jarPath) {
+ ProcessReader reader = runMavenProcessAndWait("package");
+ Path executableJar = outputPath.resolve(jarPath);
+ String output = reader.readOutputConsole();
+ assertThat(output, containsString("BUILD SUCCESS"));
+ assertThat(output, containsString("Errors: 0"));
+ assertThat(output, containsString("Failures: 0"));
+ assertThat(output, containsString("Skipped: 0"));
+ assertThat(Files.exists(executableJar), is(true));
+ }
+
+ /**
+ * {@link Process} wrapper to read I/O Stream.
+ */
+ static class ProcessReader {
+
+ private final Process process;
+ private final BufferedReader consoleReader;
+
+ ProcessReader(Process process) {
+ this.process = process;
+ this.consoleReader = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8));
+ }
+
+ public String readOutputConsole() {
+ return consoleReader.lines().collect(Collectors.joining("\n"));
+ }
+
+ @SuppressWarnings("UnusedReturnValue")
+ public boolean waitFor(long timeout, TimeUnit unit) {
+ try {
+ return process.waitFor(timeout, unit);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonClientBase.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonClientBase.java
new file mode 100644
index 00000000000..967e77bcbaf
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonClientBase.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.openapitools.codegen.java.helidon.functional;
+
+import org.testng.annotations.Test;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class FunctionalHelidonClientBase extends FunctionalBase {
+ @Test
+ void buildPetstore() {
+ generate("src/test/resources/3_0/petstore.yaml");
+ buildAndVerify("target/openapi-java-client.jar");
+ }
+
+ @Test
+ void buildPetstoreWithFakeEndpoints() {
+ generate("src/test/resources/3_0/petstore-with-fake-endpoints-models-for-testing.yaml");
+ buildAndVerify("target/openapi-java-client.jar");
+ }
+
+ @Test
+ void buildPetstoreNoMultipart() {
+ generate("src/test/resources/3_0/helidon/petstore-no-multipart-for-testing.yaml");
+ buildAndVerify("target/openapi-java-client.jar");
+ }
+
+ @Test
+ void verifyFullProjectSemantics() {
+ inputSpec("src/test/resources/3_0/petstore.yaml");
+
+ // Generate project for first time and record pom's timestamp
+ generate(createConfigurator());
+ buildAndVerify("target/openapi-java-client.jar");
+ Path pom1 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom1), is(true));
+ long lastModified = pom1.toFile().lastModified();
+
+ // Re-generate project over same directory with fullProject unspecified
+ generate(createConfigurator(outputPath));
+ Path pom2 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom2), is(true));
+ assertThat(pom2.toFile().lastModified(), is(lastModified)); // not overwritten
+
+ // Re-generate project over same directory with fullProject false
+ generate(createConfigurator(outputPath).addAdditionalProperty(FULL_PROJECT, "false"));
+ Path pom3 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom3), is(true));
+ assertThat(pom3.toFile().lastModified(), is(lastModified)); // not overwritten
+
+ // Re-generate project over same directory with fullProject true
+ generate(createConfigurator(outputPath).addAdditionalProperty(FULL_PROJECT, "true"));
+ Path pom4 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom4), is(true));
+ assertThat(pom4.toFile().lastModified(), is(not(lastModified))); // overwritten
+ }
+}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonMPClientTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonMPClientTest.java
new file mode 100644
index 00000000000..7c2aa943556
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonMPClientTest.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openapitools.codegen.java.helidon.functional;
+
+import org.testng.annotations.BeforeClass;
+
+public class FunctionalHelidonMPClientTest extends FunctionalHelidonClientBase {
+
+ @BeforeClass
+ public void setup() {
+ library("mp");
+ generatorName("java-helidon-client");
+ }
+}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonMPServerTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonMPServerTest.java
new file mode 100644
index 00000000000..ca19e93f7a3
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonMPServerTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openapitools.codegen.java.helidon.functional;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.openapitools.codegen.CodegenConstants.SERIALIZATION_LIBRARY;
+
+public class FunctionalHelidonMPServerTest extends FunctionalBase {
+
+ @BeforeClass
+ public void setup() {
+ library("mp");
+ generatorName("java-helidon-server");
+ inputSpec("src/test/resources/3_0/helidon/petstore-for-testing.yaml");
+ }
+
+ @Test
+ void buildProjectDefaultOptions() {
+ generate();
+ buildAndVerify("target/openapi-java-server.jar");
+ }
+
+ @Test
+ void buildProjectAbstractClasses() {
+ generate(createConfigurator().addAdditionalProperty(USE_ABSTRACT_CLASS, "true"));
+ buildAndVerify("target/openapi-java-server.jar");
+ }
+
+ @Test
+ void buildFullProject() {
+ generate(createConfigurator().addAdditionalProperty(FULL_PROJECT, "true"));
+ buildAndVerify("target/openapi-java-server.jar");
+ }
+
+ @Test
+ void verifyFullProjectSemantics() {
+ // Generate project for first time and record pom's timestamp
+ generate(createConfigurator());
+ buildAndVerify("target/openapi-java-server.jar");
+ Path pom1 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom1), is(true));
+ long lastModified = pom1.toFile().lastModified();
+
+ // Re-generate project over same directory with fullProject unspecified
+ generate(createConfigurator(outputPath));
+ Path pom2 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom2), is(true));
+ assertThat(pom2.toFile().lastModified(), is(lastModified)); // not overwritten
+
+ // Re-generate project over same directory with fullProject false
+ generate(createConfigurator(outputPath).addAdditionalProperty(FULL_PROJECT, "false"));
+ Path pom3 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom3), is(true));
+ assertThat(pom3.toFile().lastModified(), is(lastModified)); // not overwritten
+
+ // Re-generate project over same directory with fullProject true
+ generate(createConfigurator(outputPath).addAdditionalProperty(FULL_PROJECT, "true"));
+ Path pom4 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom4), is(true));
+ assertThat(pom4.toFile().lastModified(), is(not(lastModified))); // overwritten
+ }
+
+ @Test
+ void buildJsonbProject() {
+ generate(createConfigurator().addAdditionalProperty(SERIALIZATION_LIBRARY, "jsonb"));
+ buildAndVerify("target/openapi-java-server.jar");
+ }
+
+ @Test
+ void buildJacksonProject() {
+ generate(createConfigurator().addAdditionalProperty(SERIALIZATION_LIBRARY, "jackson"));
+ buildAndVerify("target/openapi-java-server.jar");
+ }
+}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonSEClientTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonSEClientTest.java
new file mode 100644
index 00000000000..8e390f59154
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonSEClientTest.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openapitools.codegen.java.helidon.functional;
+
+
+import org.testng.annotations.BeforeClass;
+
+public class FunctionalHelidonSEClientTest extends FunctionalHelidonClientBase {
+
+ @BeforeClass
+ public void setup() {
+ library("se");
+ generatorName("java-helidon-client");
+ }
+}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonSeServerTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonSeServerTest.java
new file mode 100644
index 00000000000..020c44257d6
--- /dev/null
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/helidon/functional/FunctionalHelidonSeServerTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2022 OpenAPI-Generator Contributors (https://openapi-generator.tech)
+ * Copyright (c) 2022 Oracle and/or its affiliates
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.openapitools.codegen.java.helidon.functional;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class FunctionalHelidonSeServerTest extends FunctionalBase {
+
+ @BeforeClass
+ public void setup() {
+ library("se");
+ generatorName("java-helidon-server");
+ }
+
+ @Test
+ void buildPetstoreWithDefaultOptions() {
+ generate("src/test/resources/3_0/petstore.yaml");
+ buildAndVerify("target/openapi-java-server.jar");
+ }
+
+ @Test
+ void buildPetstoreWithAbstractClasses() {
+ inputSpec("src/test/resources/3_0/petstore.yaml");
+ generate(createConfigurator().addAdditionalProperty(FunctionalBase.USE_ABSTRACT_CLASS, "true"));
+ buildAndVerify("target/openapi-java-server.jar");
+ }
+
+ @Test
+ void verifyFullProject() {
+ inputSpec("src/test/resources/3_0/petstore.yaml");
+
+ // Generate project for first time and record pom's timestamp
+ generate(createConfigurator());
+ buildAndVerify("target/openapi-java-server.jar");
+ Path pom1 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom1), is(true));
+ long lastModified = pom1.toFile().lastModified();
+
+ // Re-generate project over same directory with fullProject unspecified
+ generate(createConfigurator(outputPath));
+ Path pom2 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom2), is(true));
+ assertThat(pom2.toFile().lastModified(), is(lastModified)); // not overwritten
+
+ // Re-generate project over same directory with fullProject false
+ generate(createConfigurator(outputPath).addAdditionalProperty(FULL_PROJECT, "false"));
+ Path pom3 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom3), is(true));
+ assertThat(pom3.toFile().lastModified(), is(lastModified)); // not overwritten
+
+ // Re-generate project over same directory with fullProject true
+ generate(createConfigurator(outputPath).addAdditionalProperty(FULL_PROJECT, "true"));
+ Path pom4 = outputPath.resolve("pom.xml");
+ assertThat(Files.exists(pom4), is(true));
+ assertThat(pom4.toFile().lastModified(), is(not(lastModified))); // overwritten
+ }
+}
diff --git a/modules/openapi-generator/src/test/resources/3_0/helidon/petstore-for-testing.yaml b/modules/openapi-generator/src/test/resources/3_0/helidon/petstore-for-testing.yaml
new file mode 100644
index 00000000000..7384758e953
--- /dev/null
+++ b/modules/openapi-generator/src/test/resources/3_0/helidon/petstore-for-testing.yaml
@@ -0,0 +1,860 @@
+openapi: 3.0.0
+servers:
+ - url: 'http://petstore.helidon.io:8080/v2'
+info:
+ description: >-
+ This spec is mainly for testing Petstore server and contains fake endpoints,
+ models. Please do not use this for any other purpose. For this sample, you can use the api key
+ `special-key` to test the authorization filters. Special characters: "
+ \
+ version: 1.0.0
+ title: OpenAPI Petstore
+ license:
+ name: Apache-2.0
+ url: 'https://www.apache.org/licenses/LICENSE-2.0.html'
+tags:
+ - name: pet
+ description: Everything about your Pets
+ - name: store
+ description: Access to Petstore orders
+ - name: user
+ description: Operations about user
+paths:
+ /pet:
+ post:
+ tags:
+ - pet
+ summary: Add a new pet to the store
+ description: ''
+ operationId: addPet
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ '405':
+ description: Invalid input
+ security:
+ - petstore_auth:
+ - 'write:pets'
+ - 'read:pets'
+ requestBody:
+ $ref: '#/components/requestBodies/Pet'
+ put:
+ tags:
+ - pet
+ summary: Update an existing pet
+ description: ''
+ operationId: updatePet
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ '400':
+ description: Invalid ID supplied
+ '404':
+ description: Pet not found
+ '405':
+ description: Validation exception
+ security:
+ - petstore_auth:
+ - 'write:pets'
+ - 'read:pets'
+ requestBody:
+ $ref: '#/components/schemas/Pet'
+ /pet/findByStatus:
+ get:
+ tags:
+ - pet
+ summary: Finds Pets by status
+ description: Multiple status values can be provided with comma separated strings
+ operationId: findPetsByStatus
+ parameters:
+ - name: status
+ in: query
+ description: Status values that need to be considered for filter
+ required: true
+ style: form
+ explode: false
+ schema:
+ type: array
+ items:
+ type: string
+ enum:
+ - available
+ - pending
+ - sold
+ default: available
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Pet'
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Pet'
+ '400':
+ description: Invalid status value
+ security:
+ - petstore_auth:
+ - 'read:pets'
+ /pet/findByTags:
+ get:
+ tags:
+ - pet
+ summary: Finds Pets by tags
+ description: >-
+ Multiple tags can be provided with comma separated strings. Use tag1,
+ tag2, tag3 for testing.
+ operationId: findPetsByTags
+ parameters:
+ - name: tags
+ in: query
+ description: Tags to filter by
+ required: true
+ style: form
+ explode: false
+ schema:
+ type: array
+ items:
+ type: integer
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Pet'
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Pet'
+ '400':
+ description: Invalid tag value
+ security:
+ - petstore_auth:
+ - 'read:pets'
+ deprecated: true
+ '/pet/{petId}':
+ get:
+ tags:
+ - pet
+ summary: Find pet by ID
+ description: Returns a single pet
+ operationId: getPetById
+ parameters:
+ - name: petId
+ in: path
+ description: ID of pet to return
+ required: true
+ schema:
+ type: integer
+ format: int64
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ '400':
+ description: Invalid ID supplied
+ '404':
+ description: Pet not found
+ security:
+ - api_key: []
+ post:
+ tags:
+ - pet
+ summary: Updates a pet in the store with form data
+ description: ''
+ operationId: updatePetWithForm
+ parameters:
+ - name: petId
+ in: path
+ description: ID of pet that needs to be updated
+ required: true
+ schema:
+ type: integer
+ format: int64
+ responses:
+ '405':
+ description: Invalid input
+ security:
+ - petstore_auth:
+ - 'write:pets'
+ - 'read:pets'
+ requestBody:
+ content:
+ application/x-www-form-urlencoded:
+ schema:
+ type: object
+ properties:
+ name:
+ description: Updated name of the pet
+ type: string
+ status:
+ description: Updated status of the pet
+ type: string
+ delete:
+ tags:
+ - pet
+ summary: Deletes a pet
+ description: ''
+ operationId: deletePet
+ parameters:
+ - name: api_key
+ in: header
+ required: false
+ schema:
+ type: string
+ - name: headerLong
+ in: header
+ required: true
+ schema:
+ type: integer
+ format: int64
+ - name: cookieString
+ in: cookie
+ schema:
+ type: string
+ required: true
+ - name: cookieInt
+ in: cookie
+ schema:
+ type: integer
+ format: int32
+ required: false
+ - name: cookieIntArray
+ in: cookie
+ schema:
+ type: array
+ items:
+ type: integer
+ required: false
+ - name: cookieStringArray
+ in: cookie
+ schema:
+ type: array
+ items:
+ type: string
+ required: false
+ - name: petId
+ in: path
+ description: Pet id to delete
+ required: true
+ schema:
+ type: integer
+ format: int64
+ responses:
+ '400':
+ description: Invalid pet value
+ security:
+ - petstore_auth:
+ - 'write:pets'
+ - 'read:pets'
+ '/pet/{petId}/uploadImage':
+ post:
+ tags:
+ - pet
+ summary: uploads an image
+ description: ''
+ operationId: uploadFile
+ parameters:
+ - name: petId
+ in: path
+ description: ID of pet to update
+ required: true
+ schema:
+ type: integer
+ format: int64
+ minimum: 1
+ maximum: 5
+ - name: petDate
+ in: path
+ description: Date for test
+ required: true
+ schema:
+ type: integer
+ format: int64
+ minimum: 1
+ maximum: 5
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiResponse'
+ security:
+ - petstore_auth:
+ - 'write:pets'
+ - 'read:pets'
+ requestBody:
+ content:
+ multipart/form-data:
+ schema:
+ type: object
+ properties:
+ additionalMetadata:
+ description: Additional data to pass to server
+ type: string
+ file:
+ description: file to upload
+ type: string
+ format: binary
+ /pet/upload:
+ post:
+ tags:
+ - pet
+ summary: Add a few pets using form
+ description: ''
+ operationId: addPets
+ requestBody:
+ content:
+ multipart/form-data:
+ schema:
+ $ref: '#/components/schemas/PetsForm'
+ description: Object that that contains info about pets
+ required: true
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ApiResponse'
+ /store/inventory:
+ get:
+ tags:
+ - store
+ summary: Returns pet inventories by status
+ description: Returns a map of status codes to quantities
+ operationId: getInventory
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ additionalProperties:
+ type: integer
+ format: int32
+ security:
+ - api_key: []
+ /store/order:
+ post:
+ tags:
+ - store
+ summary: Place an order for a pet
+ description: ''
+ operationId: placeOrder
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Order'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Order'
+ '400':
+ description: Invalid Order
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Order'
+ description: order placed for purchasing the pet
+ required: true
+ '/store/order/{orderId}':
+ get:
+ tags:
+ - store
+ summary: Find purchase order by ID
+ description: >-
+ For valid response try integer IDs with value <= 5 or > 10. Other values
+ will generated exceptions
+ operationId: getOrderById
+ parameters:
+ - name: orderId
+ in: path
+ description: ID of pet that needs to be fetched
+ required: true
+ schema:
+ type: number
+ minimum: 1
+ maximum: 5
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Order'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Order'
+ '400':
+ description: Invalid ID supplied
+ '404':
+ description: Order not found
+ delete:
+ tags:
+ - store
+ summary: Delete purchase order by ID
+ description: >-
+ For valid response try integer IDs with value < 1000. Anything above
+ 1000 or nonintegers will generate API errors
+ operationId: deleteOrder
+ parameters:
+ - name: orderId
+ in: path
+ description: ID of the order that needs to be deleted
+ required: true
+ schema:
+ type: string
+ responses:
+ '400':
+ description: Invalid ID supplied
+ '404':
+ description: Order not found
+ /user:
+ post:
+ tags:
+ - user
+ summary: Create user
+ description: This can only be done by the logged in user.
+ operationId: createUser
+ responses:
+ default:
+ description: successful operation
+ security:
+ - api_key: []
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ description: Created user object
+ required: true
+ /user/createWithArray:
+ post:
+ tags:
+ - user
+ summary: Creates list of users with given input array
+ description: ''
+ operationId: createUsersWithArrayInput
+ responses:
+ default:
+ description: successful operation
+ security:
+ - api_key: []
+ requestBody:
+ $ref: '#/components/requestBodies/UserArray'
+ /user/createWithList:
+ post:
+ tags:
+ - user
+ summary: Creates list of users with given input array
+ description: ''
+ operationId: createUsersWithListInput
+ responses:
+ default:
+ description: successful operation
+ security:
+ - api_key: []
+ requestBody:
+ $ref: '#/components/requestBodies/UserArray'
+ /user/login:
+ get:
+ tags:
+ - user
+ summary: Logs user into the system
+ description: ''
+ operationId: loginUser
+ parameters:
+ - name: username
+ in: query
+ description: The user name for login
+ required: true
+ schema:
+ type: string
+ pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$'
+ - name: password
+ in: query
+ description: The password for login in clear text
+ required: true
+ schema:
+ type: string
+ - name: sizeString
+ in: query
+ description: String param to test Size constraint
+ required: true
+ schema:
+ type: string
+ minLength: 5
+ maxLength: 10
+ - name: minLong
+ in: query
+ description: Min Long param for test
+ required: true
+ schema:
+ type: integer
+ format: int64
+ minimum: 10
+ - name: minDecimal
+ in: query
+ description: Min Decimal param for test
+ required: true
+ schema:
+ type: number
+ minimum: 0
+ exclusiveMinimum: true
+ responses:
+ '200':
+ description: successful operation
+ headers:
+ Set-Cookie:
+ description: >-
+ Cookie authentication key for use with the `api_key`
+ apiKey authentication.
+ schema:
+ type: string
+ example: AUTH_KEY=abcde12345; Path=/; HttpOnly
+ X-Rate-Limit:
+ description: calls per hour allowed by the user
+ schema:
+ type: integer
+ format: int32
+ X-Expires-After:
+ description: date in UTC when token expires
+ schema:
+ type: string
+ format: date-time
+ content:
+ application/xml:
+ schema:
+ type: string
+ application/json:
+ schema:
+ type: string
+ '400':
+ description: Invalid username/password supplied
+ /user/logout:
+ get:
+ tags:
+ - user
+ summary: Logs out current logged in user session
+ description: ''
+ operationId: logoutUser
+ responses:
+ default:
+ description: successful operation
+ security:
+ - api_key: []
+ '/user/{username}':
+ get:
+ tags:
+ - user
+ summary: Get user by user name
+ description: ''
+ operationId: getUserByName
+ parameters:
+ - name: username
+ in: path
+ description: The name that needs to be fetched. Use user1 for testing.
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/User'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ '400':
+ description: Invalid username supplied
+ '404':
+ description: User not found
+ put:
+ tags:
+ - user
+ summary: Updated user
+ description: This can only be done by the logged in user.
+ operationId: updateUser
+ parameters:
+ - name: username
+ in: path
+ description: name that need to be deleted
+ required: true
+ schema:
+ type: string
+ responses:
+ '400':
+ description: Invalid user supplied
+ '404':
+ description: User not found
+ security:
+ - api_key: []
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ description: Updated user object
+ required: true
+ delete:
+ tags:
+ - user
+ summary: Delete user
+ description: This can only be done by the logged in user.
+ operationId: deleteUser
+ parameters:
+ - name: username
+ in: path
+ description: The name that needs to be deleted
+ required: true
+ schema:
+ type: string
+ responses:
+ '400':
+ description: Invalid username supplied
+ '404':
+ description: User not found
+ security:
+ - api_key: []
+externalDocs:
+ description: Find out more about Swagger
+ url: 'http://swagger.io'
+components:
+ requestBodies:
+ UserArray:
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/User'
+ description: List of user object
+ required: true
+ Pet:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ description: Pet object that needs to be added to the store
+ required: true
+ securitySchemes:
+ petstore_auth:
+ type: oauth2
+ flows:
+ implicit:
+ authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+ scopes:
+ 'write:pets': modify pets in your account
+ 'read:pets': read your pets
+ api_key:
+ type: apiKey
+ name: api_key
+ in: header
+ schemas:
+ AnyValue: {}
+ Color:
+ type: string
+ enum:
+ - black
+ - white
+ - red
+ - green
+ - blue
+ Order:
+ title: Pet Order
+ description: An order for a pets from the pet store
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int64
+ petId:
+ type: integer
+ format: int64
+ quantity:
+ type: integer
+ format: int32
+ shipDate:
+ type: string
+ format: date-time
+ status:
+ type: string
+ description: Order Status
+ enum:
+ - placed
+ - approved
+ - delivered
+ complete:
+ type: boolean
+ default: false
+ xml:
+ name: Order
+ Category:
+ title: Pet category
+ description: A category for a pet
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$'
+ xml:
+ name: Category
+ User:
+ title: a User
+ description: A User who is purchasing from the pet store
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int64
+ username:
+ type: string
+ firstName:
+ type: string
+ lastName:
+ type: string
+ email:
+ type: string
+ password:
+ type: string
+ phone:
+ type: string
+ userStatus:
+ type: integer
+ format: int32
+ description: User Status
+ xml:
+ name: User
+ Tag:
+ title: Pet Tag
+ description: A tag for a pet
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ xml:
+ name: Tag
+ Pet:
+ title: a Pet
+ description: A pet for sale in the pet store
+ type: object
+ required:
+ - name
+ - photoUrls
+ properties:
+ id:
+ type: integer
+ format: int64
+ category:
+ $ref: '#/components/schemas/Category'
+ name:
+ type: string
+ example: doggie
+ photoUrls:
+ type: array
+ xml:
+ name: photoUrl
+ wrapped: true
+ items:
+ type: string
+ tags:
+ type: array
+ xml:
+ name: tag
+ wrapped: true
+ items:
+ $ref: '#/components/schemas/Tag'
+ status:
+ type: string
+ description: pet status in the store
+ enum:
+ - available
+ - pending
+ - sold
+ xml:
+ name: Pet
+ ApiResponse:
+ title: An uploaded response
+ description: Describes the result of uploading an image resource
+ type: object
+ properties:
+ code:
+ type: integer
+ format: int32
+ type:
+ type: string
+ message:
+ type: string
+ PetsForm:
+ type: object
+ properties:
+ images[]:
+ type: array
+ items:
+ type: string
+ format: binary
+ image:
+ type: string
+ format: binary
+ titles[]:
+ type: array
+ items:
+ type: string
+ longArray:
+ type: array
+ items:
+ type: integer
+ format: int64
+ stringParam:
+ type: string
+ intParam:
+ type: integer
+ format: int32
+ required:
+ - stringParam
\ No newline at end of file
diff --git a/modules/openapi-generator/src/test/resources/3_0/helidon/petstore-no-multipart-for-testing.yaml b/modules/openapi-generator/src/test/resources/3_0/helidon/petstore-no-multipart-for-testing.yaml
new file mode 100644
index 00000000000..bcf99067930
--- /dev/null
+++ b/modules/openapi-generator/src/test/resources/3_0/helidon/petstore-no-multipart-for-testing.yaml
@@ -0,0 +1,789 @@
+openapi: 3.0.0
+servers:
+ - url: 'http://petstore.helidon.io:8080/v2'
+info:
+ description: >-
+ This spec is mainly for testing Petstore server and contains fake endpoints,
+ models. Please do not use this for any other purpose. For this sample, you can use the api key
+ `special-key` to test the authorization filters. Special characters: "
+ \
+ version: 1.0.0
+ title: OpenAPI Petstore
+ license:
+ name: Apache-2.0
+ url: 'https://www.apache.org/licenses/LICENSE-2.0.html'
+tags:
+ - name: pet
+ description: Everything about your Pets
+ - name: store
+ description: Access to Petstore orders
+ - name: user
+ description: Operations about user
+paths:
+ /pet:
+ post:
+ tags:
+ - pet
+ summary: Add a new pet to the store
+ description: ''
+ operationId: addPet
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ '405':
+ description: Invalid input
+ security:
+ - petstore_auth:
+ - 'write:pets'
+ - 'read:pets'
+ requestBody:
+ $ref: '#/components/requestBodies/Pet'
+ put:
+ tags:
+ - pet
+ summary: Update an existing pet
+ description: ''
+ operationId: updatePet
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ '400':
+ description: Invalid ID supplied
+ '404':
+ description: Pet not found
+ '405':
+ description: Validation exception
+ security:
+ - petstore_auth:
+ - 'write:pets'
+ - 'read:pets'
+ requestBody:
+ $ref: '#/components/schemas/Pet'
+ /pet/findByStatus:
+ get:
+ tags:
+ - pet
+ summary: Finds Pets by status
+ description: Multiple status values can be provided with comma separated strings
+ operationId: findPetsByStatus
+ parameters:
+ - name: status
+ in: query
+ description: Status values that need to be considered for filter
+ required: true
+ style: form
+ explode: false
+ schema:
+ type: array
+ items:
+ type: string
+ enum:
+ - available
+ - pending
+ - sold
+ default: available
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Pet'
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Pet'
+ '400':
+ description: Invalid status value
+ security:
+ - petstore_auth:
+ - 'read:pets'
+ /pet/findByTags:
+ get:
+ tags:
+ - pet
+ summary: Finds Pets by tags
+ description: >-
+ Multiple tags can be provided with comma separated strings. Use tag1,
+ tag2, tag3 for testing.
+ operationId: findPetsByTags
+ parameters:
+ - name: tags
+ in: query
+ description: Tags to filter by
+ required: true
+ style: form
+ explode: false
+ schema:
+ type: array
+ items:
+ type: integer
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Pet'
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/Pet'
+ '400':
+ description: Invalid tag value
+ security:
+ - petstore_auth:
+ - 'read:pets'
+ deprecated: true
+ '/pet/{petId}':
+ get:
+ tags:
+ - pet
+ summary: Find pet by ID
+ description: Returns a single pet
+ operationId: getPetById
+ parameters:
+ - name: petId
+ in: path
+ description: ID of pet to return
+ required: true
+ schema:
+ type: integer
+ format: int64
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ '400':
+ description: Invalid ID supplied
+ '404':
+ description: Pet not found
+ security:
+ - api_key: []
+ post:
+ tags:
+ - pet
+ summary: Updates a pet in the store with form data
+ description: ''
+ operationId: updatePetWithForm
+ parameters:
+ - name: petId
+ in: path
+ description: ID of pet that needs to be updated
+ required: true
+ schema:
+ type: integer
+ format: int64
+ responses:
+ '405':
+ description: Invalid input
+ security:
+ - petstore_auth:
+ - 'write:pets'
+ - 'read:pets'
+ requestBody:
+ content:
+ application/x-www-form-urlencoded:
+ schema:
+ type: object
+ properties:
+ name:
+ description: Updated name of the pet
+ type: string
+ status:
+ description: Updated status of the pet
+ type: string
+ delete:
+ tags:
+ - pet
+ summary: Deletes a pet
+ description: ''
+ operationId: deletePet
+ parameters:
+ - name: api_key
+ in: header
+ required: false
+ schema:
+ type: string
+ - name: headerLong
+ in: header
+ required: true
+ schema:
+ type: integer
+ format: int64
+ - name: cookieString
+ in: cookie
+ schema:
+ type: string
+ required: true
+ - name: cookieInt
+ in: cookie
+ schema:
+ type: integer
+ format: int32
+ required: false
+ - name: cookieIntArray
+ in: cookie
+ schema:
+ type: array
+ items:
+ type: integer
+ required: false
+ - name: cookieStringArray
+ in: cookie
+ schema:
+ type: array
+ items:
+ type: string
+ required: false
+ - name: petId
+ in: path
+ description: Pet id to delete
+ required: true
+ schema:
+ type: integer
+ format: int64
+ responses:
+ '400':
+ description: Invalid pet value
+ security:
+ - petstore_auth:
+ - 'write:pets'
+ - 'read:pets'
+ /store/inventory:
+ get:
+ tags:
+ - store
+ summary: Returns pet inventories by status
+ description: Returns a map of status codes to quantities
+ operationId: getInventory
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/json:
+ schema:
+ type: object
+ additionalProperties:
+ type: integer
+ format: int32
+ security:
+ - api_key: []
+ /store/order:
+ post:
+ tags:
+ - store
+ summary: Place an order for a pet
+ description: ''
+ operationId: placeOrder
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Order'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Order'
+ '400':
+ description: Invalid Order
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Order'
+ description: order placed for purchasing the pet
+ required: true
+ '/store/order/{orderId}':
+ get:
+ tags:
+ - store
+ summary: Find purchase order by ID
+ description: >-
+ For valid response try integer IDs with value <= 5 or > 10. Other values
+ will generated exceptions
+ operationId: getOrderById
+ parameters:
+ - name: orderId
+ in: path
+ description: ID of pet that needs to be fetched
+ required: true
+ schema:
+ type: number
+ minimum: 1
+ maximum: 5
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Order'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Order'
+ '400':
+ description: Invalid ID supplied
+ '404':
+ description: Order not found
+ delete:
+ tags:
+ - store
+ summary: Delete purchase order by ID
+ description: >-
+ For valid response try integer IDs with value < 1000. Anything above
+ 1000 or nonintegers will generate API errors
+ operationId: deleteOrder
+ parameters:
+ - name: orderId
+ in: path
+ description: ID of the order that needs to be deleted
+ required: true
+ schema:
+ type: string
+ responses:
+ '400':
+ description: Invalid ID supplied
+ '404':
+ description: Order not found
+ /user:
+ post:
+ tags:
+ - user
+ summary: Create user
+ description: This can only be done by the logged in user.
+ operationId: createUser
+ responses:
+ default:
+ description: successful operation
+ security:
+ - api_key: []
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ description: Created user object
+ required: true
+ /user/createWithArray:
+ post:
+ tags:
+ - user
+ summary: Creates list of users with given input array
+ description: ''
+ operationId: createUsersWithArrayInput
+ responses:
+ default:
+ description: successful operation
+ security:
+ - api_key: []
+ requestBody:
+ $ref: '#/components/requestBodies/UserArray'
+ /user/createWithList:
+ post:
+ tags:
+ - user
+ summary: Creates list of users with given input array
+ description: ''
+ operationId: createUsersWithListInput
+ responses:
+ default:
+ description: successful operation
+ security:
+ - api_key: []
+ requestBody:
+ $ref: '#/components/requestBodies/UserArray'
+ /user/login:
+ get:
+ tags:
+ - user
+ summary: Logs user into the system
+ description: ''
+ operationId: loginUser
+ parameters:
+ - name: username
+ in: query
+ description: The user name for login
+ required: true
+ schema:
+ type: string
+ pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$'
+ - name: password
+ in: query
+ description: The password for login in clear text
+ required: true
+ schema:
+ type: string
+ - name: sizeString
+ in: query
+ description: String param to test Size constraint
+ required: true
+ schema:
+ type: string
+ minLength: 5
+ maxLength: 10
+ - name: minLong
+ in: query
+ description: Min Long param for test
+ required: true
+ schema:
+ type: integer
+ format: int64
+ minimum: 10
+ - name: minDecimal
+ in: query
+ description: Min Decimal param for test
+ required: true
+ schema:
+ type: number
+ minimum: 0
+ exclusiveMinimum: true
+ responses:
+ '200':
+ description: successful operation
+ headers:
+ Set-Cookie:
+ description: >-
+ Cookie authentication key for use with the `api_key`
+ apiKey authentication.
+ schema:
+ type: string
+ example: AUTH_KEY=abcde12345; Path=/; HttpOnly
+ X-Rate-Limit:
+ description: calls per hour allowed by the user
+ schema:
+ type: integer
+ format: int32
+ X-Expires-After:
+ description: date in UTC when token expires
+ schema:
+ type: string
+ format: date-time
+ content:
+ application/xml:
+ schema:
+ type: string
+ application/json:
+ schema:
+ type: string
+ '400':
+ description: Invalid username/password supplied
+ /user/logout:
+ get:
+ tags:
+ - user
+ summary: Logs out current logged in user session
+ description: ''
+ operationId: logoutUser
+ responses:
+ default:
+ description: successful operation
+ security:
+ - api_key: []
+ '/user/{username}':
+ get:
+ tags:
+ - user
+ summary: Get user by user name
+ description: ''
+ operationId: getUserByName
+ parameters:
+ - name: username
+ in: path
+ description: The name that needs to be fetched. Use user1 for testing.
+ required: true
+ schema:
+ type: string
+ responses:
+ '200':
+ description: successful operation
+ content:
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/User'
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ '400':
+ description: Invalid username supplied
+ '404':
+ description: User not found
+ put:
+ tags:
+ - user
+ summary: Updated user
+ description: This can only be done by the logged in user.
+ operationId: updateUser
+ parameters:
+ - name: username
+ in: path
+ description: name that need to be deleted
+ required: true
+ schema:
+ type: string
+ responses:
+ '400':
+ description: Invalid user supplied
+ '404':
+ description: User not found
+ security:
+ - api_key: []
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/User'
+ description: Updated user object
+ required: true
+ delete:
+ tags:
+ - user
+ summary: Delete user
+ description: This can only be done by the logged in user.
+ operationId: deleteUser
+ parameters:
+ - name: username
+ in: path
+ description: The name that needs to be deleted
+ required: true
+ schema:
+ type: string
+ responses:
+ '400':
+ description: Invalid username supplied
+ '404':
+ description: User not found
+ security:
+ - api_key: []
+externalDocs:
+ description: Find out more about Swagger
+ url: 'http://swagger.io'
+components:
+ requestBodies:
+ UserArray:
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/User'
+ description: List of user object
+ required: true
+ Pet:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ application/xml:
+ schema:
+ $ref: '#/components/schemas/Pet'
+ description: Pet object that needs to be added to the store
+ required: true
+ securitySchemes:
+ petstore_auth:
+ type: oauth2
+ flows:
+ implicit:
+ authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog'
+ scopes:
+ 'write:pets': modify pets in your account
+ 'read:pets': read your pets
+ api_key:
+ type: apiKey
+ name: api_key
+ in: header
+ schemas:
+ AnyValue: {}
+ Color:
+ type: string
+ enum:
+ - black
+ - white
+ - red
+ - green
+ - blue
+ Order:
+ title: Pet Order
+ description: An order for a pets from the pet store
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int64
+ petId:
+ type: integer
+ format: int64
+ quantity:
+ type: integer
+ format: int32
+ shipDate:
+ type: string
+ format: date-time
+ status:
+ type: string
+ description: Order Status
+ enum:
+ - placed
+ - approved
+ - delivered
+ complete:
+ type: boolean
+ default: false
+ xml:
+ name: Order
+ Category:
+ title: Pet category
+ description: A category for a pet
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$'
+ xml:
+ name: Category
+ User:
+ title: a User
+ description: A User who is purchasing from the pet store
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int64
+ username:
+ type: string
+ firstName:
+ type: string
+ lastName:
+ type: string
+ email:
+ type: string
+ password:
+ type: string
+ phone:
+ type: string
+ userStatus:
+ type: integer
+ format: int32
+ description: User Status
+ xml:
+ name: User
+ Tag:
+ title: Pet Tag
+ description: A tag for a pet
+ type: object
+ properties:
+ id:
+ type: integer
+ format: int64
+ name:
+ type: string
+ xml:
+ name: Tag
+ Pet:
+ title: a Pet
+ description: A pet for sale in the pet store
+ type: object
+ required:
+ - name
+ - photoUrls
+ properties:
+ id:
+ type: integer
+ format: int64
+ category:
+ $ref: '#/components/schemas/Category'
+ name:
+ type: string
+ example: doggie
+ photoUrls:
+ type: array
+ xml:
+ name: photoUrl
+ wrapped: true
+ items:
+ type: string
+ tags:
+ type: array
+ xml:
+ name: tag
+ wrapped: true
+ items:
+ $ref: '#/components/schemas/Tag'
+ status:
+ type: string
+ description: pet status in the store
+ enum:
+ - available
+ - pending
+ - sold
+ xml:
+ name: Pet
+ ApiResponse:
+ title: An uploaded response
+ description: Describes the result of uploading an image resource
+ type: object
+ properties:
+ code:
+ type: integer
+ format: int32
+ type:
+ type: string
+ message:
+ type: string
+ PetsForm:
+ type: object
+ properties:
+ images[]:
+ type: array
+ items:
+ type: string
+ format: binary
+ image:
+ type: string
+ format: binary
+ titles[]:
+ type: array
+ items:
+ type: string
+ longArray:
+ type: array
+ items:
+ type: integer
+ format: int64
+ stringParam:
+ type: string
+ intParam:
+ type: integer
+ format: int32
+ required:
+ - stringParam
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 54b36bd4bce..7ca26d656a7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -744,6 +744,30 @@
samples/server/petstore/java-micronaut-server
+
+ java-helidon-client
+
+
+ env
+ java
+
+
+
+ samples/client/petstore/java-helidon-client
+
+
+
+ java-helidon-server
+
+
+ env
+ java
+
+
+
+ samples/server/petstore/java-helidon-server
+
+
java-msf4j-server
diff --git a/samples/client/petstore/java-helidon-client/mp/.openapi-generator-ignore b/samples/client/petstore/java-helidon-client/mp/.openapi-generator-ignore
new file mode 100644
index 00000000000..7484ee590a3
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/.openapi-generator-ignore
@@ -0,0 +1,23 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/samples/client/petstore/java-helidon-client/mp/.openapi-generator/FILES b/samples/client/petstore/java-helidon-client/mp/.openapi-generator/FILES
new file mode 100644
index 00000000000..1b046cca4ab
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/.openapi-generator/FILES
@@ -0,0 +1,116 @@
+README.md
+docs/AdditionalPropertiesClass.md
+docs/AllOfWithSingleRef.md
+docs/Animal.md
+docs/AnotherFakeApi.md
+docs/ArrayOfArrayOfNumberOnly.md
+docs/ArrayOfNumberOnly.md
+docs/ArrayTest.md
+docs/Capitalization.md
+docs/Cat.md
+docs/CatAllOf.md
+docs/Category.md
+docs/ClassModel.md
+docs/Client.md
+docs/DefaultApi.md
+docs/DeprecatedObject.md
+docs/Dog.md
+docs/DogAllOf.md
+docs/EnumArrays.md
+docs/EnumClass.md
+docs/EnumTest.md
+docs/FakeApi.md
+docs/FakeClassnameTags123Api.md
+docs/FileSchemaTestClass.md
+docs/Foo.md
+docs/FooGetDefaultResponse.md
+docs/FormatTest.md
+docs/HasOnlyReadOnly.md
+docs/HealthCheckResult.md
+docs/MapTest.md
+docs/MixedPropertiesAndAdditionalPropertiesClass.md
+docs/Model200Response.md
+docs/ModelApiResponse.md
+docs/ModelFile.md
+docs/ModelList.md
+docs/ModelReturn.md
+docs/Name.md
+docs/NullableClass.md
+docs/NumberOnly.md
+docs/ObjectWithDeprecatedFields.md
+docs/Order.md
+docs/OuterComposite.md
+docs/OuterEnum.md
+docs/OuterEnumDefaultValue.md
+docs/OuterEnumInteger.md
+docs/OuterEnumIntegerDefaultValue.md
+docs/OuterObjectWithEnumProperty.md
+docs/Pet.md
+docs/PetApi.md
+docs/ReadOnlyFirst.md
+docs/SingleRefType.md
+docs/SpecialModelName.md
+docs/StoreApi.md
+docs/Tag.md
+docs/User.md
+docs/UserApi.md
+pom.xml
+src/main/java/org/openapitools/client/JavaTimeFormatter.java
+src/main/java/org/openapitools/client/RFC3339DateFormat.java
+src/main/java/org/openapitools/client/api/AnotherFakeApi.java
+src/main/java/org/openapitools/client/api/ApiException.java
+src/main/java/org/openapitools/client/api/ApiExceptionMapper.java
+src/main/java/org/openapitools/client/api/DefaultApi.java
+src/main/java/org/openapitools/client/api/FakeApi.java
+src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java
+src/main/java/org/openapitools/client/api/PetApi.java
+src/main/java/org/openapitools/client/api/StoreApi.java
+src/main/java/org/openapitools/client/api/UserApi.java
+src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java
+src/main/java/org/openapitools/client/model/AllOfWithSingleRef.java
+src/main/java/org/openapitools/client/model/Animal.java
+src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java
+src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java
+src/main/java/org/openapitools/client/model/ArrayTest.java
+src/main/java/org/openapitools/client/model/Capitalization.java
+src/main/java/org/openapitools/client/model/Cat.java
+src/main/java/org/openapitools/client/model/CatAllOf.java
+src/main/java/org/openapitools/client/model/Category.java
+src/main/java/org/openapitools/client/model/ClassModel.java
+src/main/java/org/openapitools/client/model/Client.java
+src/main/java/org/openapitools/client/model/DeprecatedObject.java
+src/main/java/org/openapitools/client/model/Dog.java
+src/main/java/org/openapitools/client/model/DogAllOf.java
+src/main/java/org/openapitools/client/model/EnumArrays.java
+src/main/java/org/openapitools/client/model/EnumClass.java
+src/main/java/org/openapitools/client/model/EnumTest.java
+src/main/java/org/openapitools/client/model/FileSchemaTestClass.java
+src/main/java/org/openapitools/client/model/Foo.java
+src/main/java/org/openapitools/client/model/FooGetDefaultResponse.java
+src/main/java/org/openapitools/client/model/FormatTest.java
+src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java
+src/main/java/org/openapitools/client/model/HealthCheckResult.java
+src/main/java/org/openapitools/client/model/MapTest.java
+src/main/java/org/openapitools/client/model/MixedPropertiesAndAdditionalPropertiesClass.java
+src/main/java/org/openapitools/client/model/Model200Response.java
+src/main/java/org/openapitools/client/model/ModelApiResponse.java
+src/main/java/org/openapitools/client/model/ModelFile.java
+src/main/java/org/openapitools/client/model/ModelList.java
+src/main/java/org/openapitools/client/model/ModelReturn.java
+src/main/java/org/openapitools/client/model/Name.java
+src/main/java/org/openapitools/client/model/NullableClass.java
+src/main/java/org/openapitools/client/model/NumberOnly.java
+src/main/java/org/openapitools/client/model/ObjectWithDeprecatedFields.java
+src/main/java/org/openapitools/client/model/Order.java
+src/main/java/org/openapitools/client/model/OuterComposite.java
+src/main/java/org/openapitools/client/model/OuterEnum.java
+src/main/java/org/openapitools/client/model/OuterEnumDefaultValue.java
+src/main/java/org/openapitools/client/model/OuterEnumInteger.java
+src/main/java/org/openapitools/client/model/OuterEnumIntegerDefaultValue.java
+src/main/java/org/openapitools/client/model/OuterObjectWithEnumProperty.java
+src/main/java/org/openapitools/client/model/Pet.java
+src/main/java/org/openapitools/client/model/ReadOnlyFirst.java
+src/main/java/org/openapitools/client/model/SingleRefType.java
+src/main/java/org/openapitools/client/model/SpecialModelName.java
+src/main/java/org/openapitools/client/model/Tag.java
+src/main/java/org/openapitools/client/model/User.java
diff --git a/samples/client/petstore/java-helidon-client/mp/.openapi-generator/VERSION b/samples/client/petstore/java-helidon-client/mp/.openapi-generator/VERSION
new file mode 100644
index 00000000000..ed829dbcdde
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/.openapi-generator/VERSION
@@ -0,0 +1 @@
+6.2.1-SNAPSHOT
\ No newline at end of file
diff --git a/samples/client/petstore/java-helidon-client/mp/README.md b/samples/client/petstore/java-helidon-client/mp/README.md
new file mode 100644
index 00000000000..18c68cbe838
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/README.md
@@ -0,0 +1,7 @@
+# OpenAPI Petstore
+
+This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+
+
+## Overview
+This project was generated using the Helidon OpenAPI Generator.
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/AdditionalPropertiesClass.md b/samples/client/petstore/java-helidon-client/mp/docs/AdditionalPropertiesClass.md
new file mode 100644
index 00000000000..fe69a56eebf
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/AdditionalPropertiesClass.md
@@ -0,0 +1,14 @@
+
+
+# AdditionalPropertiesClass
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**mapProperty** | **Map<String, String>** | | [optional] |
+|**mapOfMapProperty** | **Map<String, Map<String, String>>** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/AllOfWithSingleRef.md b/samples/client/petstore/java-helidon-client/mp/docs/AllOfWithSingleRef.md
new file mode 100644
index 00000000000..0a9e61bc682
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/AllOfWithSingleRef.md
@@ -0,0 +1,14 @@
+
+
+# AllOfWithSingleRef
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**username** | **String** | | [optional] |
+|**singleRefType** | [**SingleRefType**](SingleRefType.md) | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Animal.md b/samples/client/petstore/java-helidon-client/mp/docs/Animal.md
new file mode 100644
index 00000000000..d9b32f14c88
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Animal.md
@@ -0,0 +1,14 @@
+
+
+# Animal
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**className** | **String** | | |
+|**color** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/AnotherFakeApi.md b/samples/client/petstore/java-helidon-client/mp/docs/AnotherFakeApi.md
new file mode 100644
index 00000000000..86cfd1bdc7c
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/AnotherFakeApi.md
@@ -0,0 +1,44 @@
+# AnotherFakeApi
+
+All URIs are relative to *http://petstore.swagger.io:80/v2*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+| [**call123testSpecialTags**](AnotherFakeApi.md#call123testSpecialTags) | **PATCH** /another-fake/dummy | To test special tags |
+
+
+
+## call123testSpecialTags
+
+> Client call123testSpecialTags(client)
+
+To test special tags
+
+To test special tags and operation ID starting with number
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **client** | [**Client**](Client.md)| client model | |
+
+### Return type
+
+[**Client**](Client.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/ArrayOfArrayOfNumberOnly.md b/samples/client/petstore/java-helidon-client/mp/docs/ArrayOfArrayOfNumberOnly.md
new file mode 100644
index 00000000000..0188db3eb13
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/ArrayOfArrayOfNumberOnly.md
@@ -0,0 +1,13 @@
+
+
+# ArrayOfArrayOfNumberOnly
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**arrayArrayNumber** | **List<List<BigDecimal>>** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/ArrayOfNumberOnly.md b/samples/client/petstore/java-helidon-client/mp/docs/ArrayOfNumberOnly.md
new file mode 100644
index 00000000000..a5753530aad
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/ArrayOfNumberOnly.md
@@ -0,0 +1,13 @@
+
+
+# ArrayOfNumberOnly
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**arrayNumber** | **List<BigDecimal>** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/ArrayTest.md b/samples/client/petstore/java-helidon-client/mp/docs/ArrayTest.md
new file mode 100644
index 00000000000..36077c9df30
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/ArrayTest.md
@@ -0,0 +1,15 @@
+
+
+# ArrayTest
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**arrayOfString** | **List<String>** | | [optional] |
+|**arrayArrayOfInteger** | **List<List<Long>>** | | [optional] |
+|**arrayArrayOfModel** | **List<List<ReadOnlyFirst>>** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Capitalization.md b/samples/client/petstore/java-helidon-client/mp/docs/Capitalization.md
new file mode 100644
index 00000000000..82a812711de
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Capitalization.md
@@ -0,0 +1,18 @@
+
+
+# Capitalization
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**smallCamel** | **String** | | [optional] |
+|**capitalCamel** | **String** | | [optional] |
+|**smallSnake** | **String** | | [optional] |
+|**capitalSnake** | **String** | | [optional] |
+|**scAETHFlowPoints** | **String** | | [optional] |
+|**ATT_NAME** | **String** | Name of the pet | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Cat.md b/samples/client/petstore/java-helidon-client/mp/docs/Cat.md
new file mode 100644
index 00000000000..390dd519c8c
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Cat.md
@@ -0,0 +1,13 @@
+
+
+# Cat
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**declawed** | **Boolean** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/CatAllOf.md b/samples/client/petstore/java-helidon-client/mp/docs/CatAllOf.md
new file mode 100644
index 00000000000..926bc0abd78
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/CatAllOf.md
@@ -0,0 +1,13 @@
+
+
+# CatAllOf
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**declawed** | **Boolean** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Category.md b/samples/client/petstore/java-helidon-client/mp/docs/Category.md
new file mode 100644
index 00000000000..ab6d1ec334d
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Category.md
@@ -0,0 +1,14 @@
+
+
+# Category
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**id** | **Long** | | [optional] |
+|**name** | **String** | | |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/ClassModel.md b/samples/client/petstore/java-helidon-client/mp/docs/ClassModel.md
new file mode 100644
index 00000000000..af46dea1f6c
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/ClassModel.md
@@ -0,0 +1,14 @@
+
+
+# ClassModel
+
+Model for testing model with \"_class\" property
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**propertyClass** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Client.md b/samples/client/petstore/java-helidon-client/mp/docs/Client.md
new file mode 100644
index 00000000000..ef07b4ab8b9
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Client.md
@@ -0,0 +1,13 @@
+
+
+# Client
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**client** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/DefaultApi.md b/samples/client/petstore/java-helidon-client/mp/docs/DefaultApi.md
new file mode 100644
index 00000000000..d94c3e5f15b
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/DefaultApi.md
@@ -0,0 +1,39 @@
+# DefaultApi
+
+All URIs are relative to *http://petstore.swagger.io:80/v2*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+| [**fooGet**](DefaultApi.md#fooGet) | **GET** /foo | |
+
+
+
+## fooGet
+
+> FooGetDefaultResponse fooGet()
+
+
+
+### Parameters
+
+This endpoint does not need any parameter.
+
+### Return type
+
+[**FooGetDefaultResponse**](FooGetDefaultResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | response | - |
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/DeprecatedObject.md b/samples/client/petstore/java-helidon-client/mp/docs/DeprecatedObject.md
new file mode 100644
index 00000000000..48de1d62442
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/DeprecatedObject.md
@@ -0,0 +1,13 @@
+
+
+# DeprecatedObject
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**name** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Dog.md b/samples/client/petstore/java-helidon-client/mp/docs/Dog.md
new file mode 100644
index 00000000000..972c981c0d0
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Dog.md
@@ -0,0 +1,13 @@
+
+
+# Dog
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**breed** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/DogAllOf.md b/samples/client/petstore/java-helidon-client/mp/docs/DogAllOf.md
new file mode 100644
index 00000000000..d4e4ea0d548
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/DogAllOf.md
@@ -0,0 +1,13 @@
+
+
+# DogAllOf
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**breed** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/EnumArrays.md b/samples/client/petstore/java-helidon-client/mp/docs/EnumArrays.md
new file mode 100644
index 00000000000..b2222d5beb2
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/EnumArrays.md
@@ -0,0 +1,32 @@
+
+
+# EnumArrays
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**justSymbol** | [**JustSymbolEnum**](#JustSymbolEnum) | | [optional] |
+|**arrayEnum** | [**List<ArrayEnumEnum>**](#List<ArrayEnumEnum>) | | [optional] |
+
+
+
+## Enum: JustSymbolEnum
+
+| Name | Value |
+|---- | -----|
+| GREATER_THAN_OR_EQUAL_TO | ">=" |
+| DOLLAR | "$" |
+
+
+
+## Enum: List<ArrayEnumEnum>
+
+| Name | Value |
+|---- | -----|
+| FISH | "fish" |
+| CRAB | "crab" |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/EnumClass.md b/samples/client/petstore/java-helidon-client/mp/docs/EnumClass.md
new file mode 100644
index 00000000000..b314590a759
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/EnumClass.md
@@ -0,0 +1,15 @@
+
+
+# EnumClass
+
+## Enum
+
+
+* `_ABC` (value: `"_abc"`)
+
+* `_EFG` (value: `"-efg"`)
+
+* `_XYZ_` (value: `"(xyz)"`)
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/EnumTest.md b/samples/client/petstore/java-helidon-client/mp/docs/EnumTest.md
new file mode 100644
index 00000000000..380a2aef0bc
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/EnumTest.md
@@ -0,0 +1,58 @@
+
+
+# EnumTest
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**enumString** | [**EnumStringEnum**](#EnumStringEnum) | | [optional] |
+|**enumStringRequired** | [**EnumStringRequiredEnum**](#EnumStringRequiredEnum) | | |
+|**enumInteger** | [**EnumIntegerEnum**](#EnumIntegerEnum) | | [optional] |
+|**enumNumber** | [**EnumNumberEnum**](#EnumNumberEnum) | | [optional] |
+|**outerEnum** | **OuterEnum** | | [optional] |
+|**outerEnumInteger** | **OuterEnumInteger** | | [optional] |
+|**outerEnumDefaultValue** | **OuterEnumDefaultValue** | | [optional] |
+|**outerEnumIntegerDefaultValue** | **OuterEnumIntegerDefaultValue** | | [optional] |
+
+
+
+## Enum: EnumStringEnum
+
+| Name | Value |
+|---- | -----|
+| UPPER | "UPPER" |
+| LOWER | "lower" |
+| EMPTY | "" |
+
+
+
+## Enum: EnumStringRequiredEnum
+
+| Name | Value |
+|---- | -----|
+| UPPER | "UPPER" |
+| LOWER | "lower" |
+| EMPTY | "" |
+
+
+
+## Enum: EnumIntegerEnum
+
+| Name | Value |
+|---- | -----|
+| NUMBER_1 | 1 |
+| NUMBER_MINUS_1 | -1 |
+
+
+
+## Enum: EnumNumberEnum
+
+| Name | Value |
+|---- | -----|
+| NUMBER_1_DOT_1 | 1.1 |
+| NUMBER_MINUS_1_DOT_2 | -1.2 |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/FakeApi.md b/samples/client/petstore/java-helidon-client/mp/docs/FakeApi.md
new file mode 100644
index 00000000000..9dfe49d51cc
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/FakeApi.md
@@ -0,0 +1,649 @@
+# FakeApi
+
+All URIs are relative to *http://petstore.swagger.io:80/v2*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+| [**fakeHealthGet**](FakeApi.md#fakeHealthGet) | **GET** /fake/health | Health check endpoint |
+| [**fakeHttpSignatureTest**](FakeApi.md#fakeHttpSignatureTest) | **GET** /fake/http-signature-test | test http signature authentication |
+| [**fakeOuterBooleanSerialize**](FakeApi.md#fakeOuterBooleanSerialize) | **POST** /fake/outer/boolean | |
+| [**fakeOuterCompositeSerialize**](FakeApi.md#fakeOuterCompositeSerialize) | **POST** /fake/outer/composite | |
+| [**fakeOuterNumberSerialize**](FakeApi.md#fakeOuterNumberSerialize) | **POST** /fake/outer/number | |
+| [**fakeOuterStringSerialize**](FakeApi.md#fakeOuterStringSerialize) | **POST** /fake/outer/string | |
+| [**fakePropertyEnumIntegerSerialize**](FakeApi.md#fakePropertyEnumIntegerSerialize) | **POST** /fake/property/enum-int | |
+| [**testBodyWithBinary**](FakeApi.md#testBodyWithBinary) | **PUT** /fake/body-with-binary | |
+| [**testBodyWithFileSchema**](FakeApi.md#testBodyWithFileSchema) | **PUT** /fake/body-with-file-schema | |
+| [**testBodyWithQueryParams**](FakeApi.md#testBodyWithQueryParams) | **PUT** /fake/body-with-query-params | |
+| [**testClientModel**](FakeApi.md#testClientModel) | **PATCH** /fake | To test \"client\" model |
+| [**testEndpointParameters**](FakeApi.md#testEndpointParameters) | **POST** /fake | Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 |
+| [**testEnumParameters**](FakeApi.md#testEnumParameters) | **GET** /fake | To test enum parameters |
+| [**testGroupParameters**](FakeApi.md#testGroupParameters) | **DELETE** /fake | Fake endpoint to test group parameters (optional) |
+| [**testInlineAdditionalProperties**](FakeApi.md#testInlineAdditionalProperties) | **POST** /fake/inline-additionalProperties | test inline additionalProperties |
+| [**testJsonFormData**](FakeApi.md#testJsonFormData) | **GET** /fake/jsonFormData | test json serialization of form data |
+| [**testQueryParameterCollectionFormat**](FakeApi.md#testQueryParameterCollectionFormat) | **PUT** /fake/test-query-parameters | |
+
+
+
+## fakeHealthGet
+
+> HealthCheckResult fakeHealthGet()
+
+Health check endpoint
+
+### Parameters
+
+This endpoint does not need any parameter.
+
+### Return type
+
+[**HealthCheckResult**](HealthCheckResult.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | The instance started successfully | - |
+
+
+## fakeHttpSignatureTest
+
+> void fakeHttpSignatureTest(pet, query1, header1)
+
+test http signature authentication
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **pet** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | |
+| **query1** | **String**| query parameter | [optional] |
+| **header1** | **String**| header parameter | [optional] |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+[http_signature_test](../README.md#http_signature_test)
+
+### HTTP request headers
+
+- **Content-Type**: application/json, application/xml
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | The instance started successfully | - |
+
+
+## fakeOuterBooleanSerialize
+
+> Boolean fakeOuterBooleanSerialize(body)
+
+
+
+Test serialization of outer boolean types
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **body** | **Boolean**| Input boolean as post body | [optional] |
+
+### Return type
+
+**Boolean**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: */*
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Output boolean | - |
+
+
+## fakeOuterCompositeSerialize
+
+> OuterComposite fakeOuterCompositeSerialize(outerComposite)
+
+
+
+Test serialization of object with outer number type
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **outerComposite** | [**OuterComposite**](OuterComposite.md)| Input composite as post body | [optional] |
+
+### Return type
+
+[**OuterComposite**](OuterComposite.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: */*
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Output composite | - |
+
+
+## fakeOuterNumberSerialize
+
+> BigDecimal fakeOuterNumberSerialize(body)
+
+
+
+Test serialization of outer number types
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **body** | **BigDecimal**| Input number as post body | [optional] |
+
+### Return type
+
+[**BigDecimal**](BigDecimal.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: */*
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Output number | - |
+
+
+## fakeOuterStringSerialize
+
+> String fakeOuterStringSerialize(body)
+
+
+
+Test serialization of outer string types
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **body** | **String**| Input string as post body | [optional] |
+
+### Return type
+
+**String**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: */*
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Output string | - |
+
+
+## fakePropertyEnumIntegerSerialize
+
+> OuterObjectWithEnumProperty fakePropertyEnumIntegerSerialize(outerObjectWithEnumProperty)
+
+
+
+Test serialization of enum (int) properties with examples
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **outerObjectWithEnumProperty** | [**OuterObjectWithEnumProperty**](OuterObjectWithEnumProperty.md)| Input enum (int) as post body | |
+
+### Return type
+
+[**OuterObjectWithEnumProperty**](OuterObjectWithEnumProperty.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: */*
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Output enum (int) | - |
+
+
+## testBodyWithBinary
+
+> void testBodyWithBinary(body)
+
+
+
+For this test, the body has to be a binary file.
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **body** | **File**| image to upload | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: image/png
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Success | - |
+
+
+## testBodyWithFileSchema
+
+> void testBodyWithFileSchema(fileSchemaTestClass)
+
+
+
+For this test, the body for this request must reference a schema named `File`.
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **fileSchemaTestClass** | [**FileSchemaTestClass**](FileSchemaTestClass.md)| | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Success | - |
+
+
+## testBodyWithQueryParams
+
+> void testBodyWithQueryParams(query, user)
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **query** | **String**| | |
+| **user** | [**User**](User.md)| | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Success | - |
+
+
+## testClientModel
+
+> Client testClientModel(client)
+
+To test \"client\" model
+
+To test \"client\" model
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **client** | [**Client**](Client.md)| client model | |
+
+### Return type
+
+[**Client**](Client.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
+
+## testEndpointParameters
+
+> void testEndpointParameters(number, _double, patternWithoutDelimiter, _byte, integer, int32, int64, _float, string, binary, date, dateTime, password, paramCallback)
+
+Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+
+Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **number** | **BigDecimal**| None | |
+| **_double** | **Double**| None | |
+| **patternWithoutDelimiter** | **String**| None | |
+| **_byte** | **byte[]**| None | |
+| **integer** | **Integer**| None | [optional] |
+| **int32** | **Integer**| None | [optional] |
+| **int64** | **Long**| None | [optional] |
+| **_float** | **Float**| None | [optional] |
+| **string** | **String**| None | [optional] |
+| **binary** | **File**| None | [optional] |
+| **date** | **LocalDate**| None | [optional] |
+| **dateTime** | **OffsetDateTime**| None | [optional] |
+| **password** | **String**| None | [optional] |
+| **paramCallback** | **String**| None | [optional] |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+[http_basic_test](../README.md#http_basic_test)
+
+### HTTP request headers
+
+- **Content-Type**: application/x-www-form-urlencoded
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **400** | Invalid username supplied | - |
+| **404** | User not found | - |
+
+
+## testEnumParameters
+
+> void testEnumParameters(enumHeaderStringArray, enumHeaderString, enumQueryStringArray, enumQueryString, enumQueryInteger, enumQueryDouble, enumQueryModelArray, enumFormStringArray, enumFormString)
+
+To test enum parameters
+
+To test enum parameters
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **enumHeaderStringArray** | [**List<String>**](String.md)| Header parameter enum test (string array) | [optional] [enum: >, $] |
+| **enumHeaderString** | **String**| Header parameter enum test (string) | [optional] [default to -efg] [enum: _abc, -efg, (xyz)] |
+| **enumQueryStringArray** | [**List<String>**](String.md)| Query parameter enum test (string array) | [optional] [enum: >, $] |
+| **enumQueryString** | **String**| Query parameter enum test (string) | [optional] [default to -efg] [enum: _abc, -efg, (xyz)] |
+| **enumQueryInteger** | **Integer**| Query parameter enum test (double) | [optional] [enum: 1, -2] |
+| **enumQueryDouble** | **Double**| Query parameter enum test (double) | [optional] [enum: 1.1, -1.2] |
+| **enumQueryModelArray** | [**List<EnumClass>**](EnumClass.md)| | [optional] |
+| **enumFormStringArray** | [**List<String>**](String.md)| Form parameter enum test (string array) | [optional] [enum: >, $] |
+| **enumFormString** | **String**| Form parameter enum test (string) | [optional] [default to -efg] [enum: _abc, -efg, (xyz)] |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/x-www-form-urlencoded
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **400** | Invalid request | - |
+| **404** | Not found | - |
+
+
+## testGroupParameters
+
+> void testGroupParameters(requiredStringGroup, requiredBooleanGroup, requiredInt64Group, stringGroup, booleanGroup, int64Group)
+
+Fake endpoint to test group parameters (optional)
+
+Fake endpoint to test group parameters (optional)
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **requiredStringGroup** | **Integer**| Required String in group parameters | |
+| **requiredBooleanGroup** | **Boolean**| Required Boolean in group parameters | |
+| **requiredInt64Group** | **Long**| Required Integer in group parameters | |
+| **stringGroup** | **Integer**| String in group parameters | [optional] |
+| **booleanGroup** | **Boolean**| Boolean in group parameters | [optional] |
+| **int64Group** | **Long**| Integer in group parameters | [optional] |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+[bearer_test](../README.md#bearer_test)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **400** | Someting wrong | - |
+
+
+## testInlineAdditionalProperties
+
+> void testInlineAdditionalProperties(requestBody)
+
+test inline additionalProperties
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **requestBody** | [**Map<String, String>**](String.md)| request body | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
+
+## testJsonFormData
+
+> void testJsonFormData(param, param2)
+
+test json serialization of form data
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **param** | **String**| field1 | |
+| **param2** | **String**| field2 | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/x-www-form-urlencoded
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
+
+## testQueryParameterCollectionFormat
+
+> void testQueryParameterCollectionFormat(pipe, ioutil, http, url, context, allowEmpty, language)
+
+
+
+To test the collection format in query parameters
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **pipe** | [**List<String>**](String.md)| | |
+| **ioutil** | [**List<String>**](String.md)| | |
+| **http** | [**List<String>**](String.md)| | |
+| **url** | [**List<String>**](String.md)| | |
+| **context** | [**List<String>**](String.md)| | |
+| **allowEmpty** | **String**| | |
+| **language** | [**Map<String, String>**](String.md)| | [optional] |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Success | - |
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/FakeClassnameTags123Api.md b/samples/client/petstore/java-helidon-client/mp/docs/FakeClassnameTags123Api.md
new file mode 100644
index 00000000000..bcea773b6fb
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/FakeClassnameTags123Api.md
@@ -0,0 +1,44 @@
+# FakeClassnameTags123Api
+
+All URIs are relative to *http://petstore.swagger.io:80/v2*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+| [**testClassname**](FakeClassnameTags123Api.md#testClassname) | **PATCH** /fake_classname_test | To test class name in snake case |
+
+
+
+## testClassname
+
+> Client testClassname(client)
+
+To test class name in snake case
+
+To test class name in snake case
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **client** | [**Client**](Client.md)| client model | |
+
+### Return type
+
+[**Client**](Client.md)
+
+### Authorization
+
+[api_key_query](../README.md#api_key_query)
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/FileSchemaTestClass.md b/samples/client/petstore/java-helidon-client/mp/docs/FileSchemaTestClass.md
new file mode 100644
index 00000000000..85d1a063669
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/FileSchemaTestClass.md
@@ -0,0 +1,14 @@
+
+
+# FileSchemaTestClass
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**_file** | [**ModelFile**](ModelFile.md) | | [optional] |
+|**files** | [**List<ModelFile>**](ModelFile.md) | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Foo.md b/samples/client/petstore/java-helidon-client/mp/docs/Foo.md
new file mode 100644
index 00000000000..6b3f0556528
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Foo.md
@@ -0,0 +1,13 @@
+
+
+# Foo
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**bar** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/FooGetDefaultResponse.md b/samples/client/petstore/java-helidon-client/mp/docs/FooGetDefaultResponse.md
new file mode 100644
index 00000000000..ff3d7a3a56c
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/FooGetDefaultResponse.md
@@ -0,0 +1,13 @@
+
+
+# FooGetDefaultResponse
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**string** | [**Foo**](Foo.md) | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/FormatTest.md b/samples/client/petstore/java-helidon-client/mp/docs/FormatTest.md
new file mode 100644
index 00000000000..01b8c777ae0
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/FormatTest.md
@@ -0,0 +1,28 @@
+
+
+# FormatTest
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**integer** | **Integer** | | [optional] |
+|**int32** | **Integer** | | [optional] |
+|**int64** | **Long** | | [optional] |
+|**number** | **BigDecimal** | | |
+|**_float** | **Float** | | [optional] |
+|**_double** | **Double** | | [optional] |
+|**decimal** | **BigDecimal** | | [optional] |
+|**string** | **String** | | [optional] |
+|**_byte** | **byte[]** | | |
+|**binary** | **File** | | [optional] |
+|**date** | **LocalDate** | | |
+|**dateTime** | **OffsetDateTime** | | [optional] |
+|**uuid** | **UUID** | | [optional] |
+|**password** | **String** | | |
+|**patternWithDigits** | **String** | A string that is a 10 digit number. Can have leading zeros. | [optional] |
+|**patternWithDigitsAndDelimiter** | **String** | A string starting with 'image_' (case insensitive) and one to three digits following i.e. Image_01. | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/HasOnlyReadOnly.md b/samples/client/petstore/java-helidon-client/mp/docs/HasOnlyReadOnly.md
new file mode 100644
index 00000000000..29da5205dbb
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/HasOnlyReadOnly.md
@@ -0,0 +1,14 @@
+
+
+# HasOnlyReadOnly
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**bar** | **String** | | [optional] [readonly] |
+|**foo** | **String** | | [optional] [readonly] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/HealthCheckResult.md b/samples/client/petstore/java-helidon-client/mp/docs/HealthCheckResult.md
new file mode 100644
index 00000000000..4885e6f1cad
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/HealthCheckResult.md
@@ -0,0 +1,14 @@
+
+
+# HealthCheckResult
+
+Just a string to inform instance is up and running. Make it nullable in hope to get it as pointer in generated model.
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**nullableMessage** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/MapTest.md b/samples/client/petstore/java-helidon-client/mp/docs/MapTest.md
new file mode 100644
index 00000000000..54380188e1d
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/MapTest.md
@@ -0,0 +1,25 @@
+
+
+# MapTest
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**mapMapOfString** | **Map<String, Map<String, String>>** | | [optional] |
+|**mapOfEnumString** | [**Map<String, InnerEnum>**](#Map<String, InnerEnum>) | | [optional] |
+|**directMap** | **Map<String, Boolean>** | | [optional] |
+|**indirectMap** | **Map<String, Boolean>** | | [optional] |
+
+
+
+## Enum: Map<String, InnerEnum>
+
+| Name | Value |
+|---- | -----|
+| UPPER | "UPPER" |
+| LOWER | "lower" |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/MixedPropertiesAndAdditionalPropertiesClass.md b/samples/client/petstore/java-helidon-client/mp/docs/MixedPropertiesAndAdditionalPropertiesClass.md
new file mode 100644
index 00000000000..a5ddf0faa6a
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/MixedPropertiesAndAdditionalPropertiesClass.md
@@ -0,0 +1,15 @@
+
+
+# MixedPropertiesAndAdditionalPropertiesClass
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**uuid** | **UUID** | | [optional] |
+|**dateTime** | **OffsetDateTime** | | [optional] |
+|**map** | [**Map<String, Animal>**](Animal.md) | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Model200Response.md b/samples/client/petstore/java-helidon-client/mp/docs/Model200Response.md
new file mode 100644
index 00000000000..109411580c6
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Model200Response.md
@@ -0,0 +1,15 @@
+
+
+# Model200Response
+
+Model for testing model name starting with number
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**name** | **Integer** | | [optional] |
+|**propertyClass** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/ModelApiResponse.md b/samples/client/petstore/java-helidon-client/mp/docs/ModelApiResponse.md
new file mode 100644
index 00000000000..e374c2dd2de
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/ModelApiResponse.md
@@ -0,0 +1,15 @@
+
+
+# ModelApiResponse
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**code** | **Integer** | | [optional] |
+|**type** | **String** | | [optional] |
+|**message** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/ModelFile.md b/samples/client/petstore/java-helidon-client/mp/docs/ModelFile.md
new file mode 100644
index 00000000000..adcde984f52
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/ModelFile.md
@@ -0,0 +1,14 @@
+
+
+# ModelFile
+
+Must be named `File` for test.
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**sourceURI** | **String** | Test capitalization | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/ModelList.md b/samples/client/petstore/java-helidon-client/mp/docs/ModelList.md
new file mode 100644
index 00000000000..f93ab7dde8d
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/ModelList.md
@@ -0,0 +1,13 @@
+
+
+# ModelList
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**_123list** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/ModelReturn.md b/samples/client/petstore/java-helidon-client/mp/docs/ModelReturn.md
new file mode 100644
index 00000000000..0bd356861eb
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/ModelReturn.md
@@ -0,0 +1,14 @@
+
+
+# ModelReturn
+
+Model for testing reserved words
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**_return** | **Integer** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Name.md b/samples/client/petstore/java-helidon-client/mp/docs/Name.md
new file mode 100644
index 00000000000..c901d943530
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Name.md
@@ -0,0 +1,17 @@
+
+
+# Name
+
+Model for testing model name same as property name
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**name** | **Integer** | | |
+|**snakeCase** | **Integer** | | [optional] [readonly] |
+|**property** | **String** | | [optional] |
+|**_123number** | **Integer** | | [optional] [readonly] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/NullableClass.md b/samples/client/petstore/java-helidon-client/mp/docs/NullableClass.md
new file mode 100644
index 00000000000..fa98c5c6d98
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/NullableClass.md
@@ -0,0 +1,24 @@
+
+
+# NullableClass
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**integerProp** | **Integer** | | [optional] |
+|**numberProp** | **BigDecimal** | | [optional] |
+|**booleanProp** | **Boolean** | | [optional] |
+|**stringProp** | **String** | | [optional] |
+|**dateProp** | **LocalDate** | | [optional] |
+|**datetimeProp** | **OffsetDateTime** | | [optional] |
+|**arrayNullableProp** | **List<Object>** | | [optional] |
+|**arrayAndItemsNullableProp** | **List<Object>** | | [optional] |
+|**arrayItemsNullable** | **List<Object>** | | [optional] |
+|**objectNullableProp** | **Map<String, Object>** | | [optional] |
+|**objectAndItemsNullableProp** | **Map<String, Object>** | | [optional] |
+|**objectItemsNullable** | **Map<String, Object>** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/NumberOnly.md b/samples/client/petstore/java-helidon-client/mp/docs/NumberOnly.md
new file mode 100644
index 00000000000..b8ed1a4cfae
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/NumberOnly.md
@@ -0,0 +1,13 @@
+
+
+# NumberOnly
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**justNumber** | **BigDecimal** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/ObjectWithDeprecatedFields.md b/samples/client/petstore/java-helidon-client/mp/docs/ObjectWithDeprecatedFields.md
new file mode 100644
index 00000000000..f1cf571f4c0
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/ObjectWithDeprecatedFields.md
@@ -0,0 +1,16 @@
+
+
+# ObjectWithDeprecatedFields
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**uuid** | **String** | | [optional] |
+|**id** | **BigDecimal** | | [optional] |
+|**deprecatedRef** | [**DeprecatedObject**](DeprecatedObject.md) | | [optional] |
+|**bars** | **List<String>** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Order.md b/samples/client/petstore/java-helidon-client/mp/docs/Order.md
new file mode 100644
index 00000000000..27af32855c5
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Order.md
@@ -0,0 +1,28 @@
+
+
+# Order
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**id** | **Long** | | [optional] |
+|**petId** | **Long** | | [optional] |
+|**quantity** | **Integer** | | [optional] |
+|**shipDate** | **OffsetDateTime** | | [optional] |
+|**status** | [**StatusEnum**](#StatusEnum) | Order Status | [optional] |
+|**complete** | **Boolean** | | [optional] |
+
+
+
+## Enum: StatusEnum
+
+| Name | Value |
+|---- | -----|
+| PLACED | "placed" |
+| APPROVED | "approved" |
+| DELIVERED | "delivered" |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/OuterComposite.md b/samples/client/petstore/java-helidon-client/mp/docs/OuterComposite.md
new file mode 100644
index 00000000000..98b56e0763f
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/OuterComposite.md
@@ -0,0 +1,15 @@
+
+
+# OuterComposite
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**myNumber** | **BigDecimal** | | [optional] |
+|**myString** | **String** | | [optional] |
+|**myBoolean** | **Boolean** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/OuterEnum.md b/samples/client/petstore/java-helidon-client/mp/docs/OuterEnum.md
new file mode 100644
index 00000000000..1f9b723eb8e
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/OuterEnum.md
@@ -0,0 +1,15 @@
+
+
+# OuterEnum
+
+## Enum
+
+
+* `PLACED` (value: `"placed"`)
+
+* `APPROVED` (value: `"approved"`)
+
+* `DELIVERED` (value: `"delivered"`)
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/OuterEnumDefaultValue.md b/samples/client/petstore/java-helidon-client/mp/docs/OuterEnumDefaultValue.md
new file mode 100644
index 00000000000..cbc7f4ba54d
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/OuterEnumDefaultValue.md
@@ -0,0 +1,15 @@
+
+
+# OuterEnumDefaultValue
+
+## Enum
+
+
+* `PLACED` (value: `"placed"`)
+
+* `APPROVED` (value: `"approved"`)
+
+* `DELIVERED` (value: `"delivered"`)
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/OuterEnumInteger.md b/samples/client/petstore/java-helidon-client/mp/docs/OuterEnumInteger.md
new file mode 100644
index 00000000000..f71dea30ad0
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/OuterEnumInteger.md
@@ -0,0 +1,15 @@
+
+
+# OuterEnumInteger
+
+## Enum
+
+
+* `NUMBER_0` (value: `0`)
+
+* `NUMBER_1` (value: `1`)
+
+* `NUMBER_2` (value: `2`)
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/OuterEnumIntegerDefaultValue.md b/samples/client/petstore/java-helidon-client/mp/docs/OuterEnumIntegerDefaultValue.md
new file mode 100644
index 00000000000..99e6389f427
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/OuterEnumIntegerDefaultValue.md
@@ -0,0 +1,15 @@
+
+
+# OuterEnumIntegerDefaultValue
+
+## Enum
+
+
+* `NUMBER_0` (value: `0`)
+
+* `NUMBER_1` (value: `1`)
+
+* `NUMBER_2` (value: `2`)
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/OuterObjectWithEnumProperty.md b/samples/client/petstore/java-helidon-client/mp/docs/OuterObjectWithEnumProperty.md
new file mode 100644
index 00000000000..0fafaaa2715
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/OuterObjectWithEnumProperty.md
@@ -0,0 +1,13 @@
+
+
+# OuterObjectWithEnumProperty
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**value** | **OuterEnumInteger** | | |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Pet.md b/samples/client/petstore/java-helidon-client/mp/docs/Pet.md
new file mode 100644
index 00000000000..54af77a9f5a
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Pet.md
@@ -0,0 +1,28 @@
+
+
+# Pet
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**id** | **Long** | | [optional] |
+|**category** | [**Category**](Category.md) | | [optional] |
+|**name** | **String** | | |
+|**photoUrls** | **Set<String>** | | |
+|**tags** | [**List<Tag>**](Tag.md) | | [optional] |
+|**status** | [**StatusEnum**](#StatusEnum) | pet status in the store | [optional] |
+
+
+
+## Enum: StatusEnum
+
+| Name | Value |
+|---- | -----|
+| AVAILABLE | "available" |
+| PENDING | "pending" |
+| SOLD | "sold" |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/PetApi.md b/samples/client/petstore/java-helidon-client/mp/docs/PetApi.md
new file mode 100644
index 00000000000..2f1e3c02a2e
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/PetApi.md
@@ -0,0 +1,349 @@
+# PetApi
+
+All URIs are relative to *http://petstore.swagger.io:80/v2*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+| [**addPet**](PetApi.md#addPet) | **POST** /pet | Add a new pet to the store |
+| [**deletePet**](PetApi.md#deletePet) | **DELETE** /pet/{petId} | Deletes a pet |
+| [**findPetsByStatus**](PetApi.md#findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status |
+| [**findPetsByTags**](PetApi.md#findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags |
+| [**getPetById**](PetApi.md#getPetById) | **GET** /pet/{petId} | Find pet by ID |
+| [**updatePet**](PetApi.md#updatePet) | **PUT** /pet | Update an existing pet |
+| [**updatePetWithForm**](PetApi.md#updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data |
+| [**uploadFile**](PetApi.md#uploadFile) | **POST** /pet/{petId}/uploadImage | uploads an image |
+| [**uploadFileWithRequiredFile**](PetApi.md#uploadFileWithRequiredFile) | **POST** /fake/{petId}/uploadImageWithRequiredFile | uploads an image (required) |
+
+
+
+## addPet
+
+> void addPet(pet)
+
+Add a new pet to the store
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **pet** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+[petstore_auth](../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: application/json, application/xml
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Successful operation | - |
+| **405** | Invalid input | - |
+
+
+## deletePet
+
+> void deletePet(petId, apiKey)
+
+Deletes a pet
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **petId** | **Long**| Pet id to delete | |
+| **apiKey** | **String**| | [optional] |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+[petstore_auth](../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Successful operation | - |
+| **400** | Invalid pet value | - |
+
+
+## findPetsByStatus
+
+> List<Pet> findPetsByStatus(status)
+
+Finds Pets by status
+
+Multiple status values can be provided with comma separated strings
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **status** | [**List<String>**](String.md)| Status values that need to be considered for filter | [enum: available, pending, sold] |
+
+### Return type
+
+[**List<Pet>**](Pet.md)
+
+### Authorization
+
+[petstore_auth](../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/xml, application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+| **400** | Invalid status value | - |
+
+
+## findPetsByTags
+
+> Set<Pet> findPetsByTags(tags)
+
+Finds Pets by tags
+
+Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **tags** | [**Set<String>**](String.md)| Tags to filter by | |
+
+### Return type
+
+[**Set<Pet>**](Pet.md)
+
+### Authorization
+
+[petstore_auth](../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/xml, application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+| **400** | Invalid tag value | - |
+
+
+## getPetById
+
+> Pet getPetById(petId)
+
+Find pet by ID
+
+Returns a single pet
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **petId** | **Long**| ID of pet to return | |
+
+### Return type
+
+[**Pet**](Pet.md)
+
+### Authorization
+
+[api_key](../README.md#api_key)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/xml, application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+| **400** | Invalid ID supplied | - |
+| **404** | Pet not found | - |
+
+
+## updatePet
+
+> void updatePet(pet)
+
+Update an existing pet
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **pet** | [**Pet**](Pet.md)| Pet object that needs to be added to the store | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+[petstore_auth](../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: application/json, application/xml
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Successful operation | - |
+| **400** | Invalid ID supplied | - |
+| **404** | Pet not found | - |
+| **405** | Validation exception | - |
+
+
+## updatePetWithForm
+
+> void updatePetWithForm(petId, name, status)
+
+Updates a pet in the store with form data
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **petId** | **Long**| ID of pet that needs to be updated | |
+| **name** | **String**| Updated name of the pet | [optional] |
+| **status** | **String**| Updated status of the pet | [optional] |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+[petstore_auth](../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: application/x-www-form-urlencoded
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | Successful operation | - |
+| **405** | Invalid input | - |
+
+
+## uploadFile
+
+> ModelApiResponse uploadFile(petId, additionalMetadata, _file)
+
+uploads an image
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **petId** | **Long**| ID of pet to update | |
+| **additionalMetadata** | **String**| Additional data to pass to server | [optional] |
+| **_file** | **File**| file to upload | [optional] |
+
+### Return type
+
+[**ModelApiResponse**](ModelApiResponse.md)
+
+### Authorization
+
+[petstore_auth](../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: multipart/form-data
+- **Accept**: application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
+
+## uploadFileWithRequiredFile
+
+> ModelApiResponse uploadFileWithRequiredFile(petId, requiredFile, additionalMetadata)
+
+uploads an image (required)
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **petId** | **Long**| ID of pet to update | |
+| **requiredFile** | **File**| file to upload | |
+| **additionalMetadata** | **String**| Additional data to pass to server | [optional] |
+
+### Return type
+
+[**ModelApiResponse**](ModelApiResponse.md)
+
+### Authorization
+
+[petstore_auth](../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: multipart/form-data
+- **Accept**: application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/ReadOnlyFirst.md b/samples/client/petstore/java-helidon-client/mp/docs/ReadOnlyFirst.md
new file mode 100644
index 00000000000..ad6af7ee155
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/ReadOnlyFirst.md
@@ -0,0 +1,14 @@
+
+
+# ReadOnlyFirst
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**bar** | **String** | | [optional] [readonly] |
+|**baz** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/SingleRefType.md b/samples/client/petstore/java-helidon-client/mp/docs/SingleRefType.md
new file mode 100644
index 00000000000..cc269bb871f
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/SingleRefType.md
@@ -0,0 +1,13 @@
+
+
+# SingleRefType
+
+## Enum
+
+
+* `ADMIN` (value: `"admin"`)
+
+* `USER` (value: `"user"`)
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/SpecialModelName.md b/samples/client/petstore/java-helidon-client/mp/docs/SpecialModelName.md
new file mode 100644
index 00000000000..4b6a06e3622
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/SpecialModelName.md
@@ -0,0 +1,13 @@
+
+
+# SpecialModelName
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**$specialPropertyName** | **Long** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/StoreApi.md b/samples/client/petstore/java-helidon-client/mp/docs/StoreApi.md
new file mode 100644
index 00000000000..299fb326568
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/StoreApi.md
@@ -0,0 +1,153 @@
+# StoreApi
+
+All URIs are relative to *http://petstore.swagger.io:80/v2*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+| [**deleteOrder**](StoreApi.md#deleteOrder) | **DELETE** /store/order/{order_id} | Delete purchase order by ID |
+| [**getInventory**](StoreApi.md#getInventory) | **GET** /store/inventory | Returns pet inventories by status |
+| [**getOrderById**](StoreApi.md#getOrderById) | **GET** /store/order/{order_id} | Find purchase order by ID |
+| [**placeOrder**](StoreApi.md#placeOrder) | **POST** /store/order | Place an order for a pet |
+
+
+
+## deleteOrder
+
+> void deleteOrder(orderId)
+
+Delete purchase order by ID
+
+For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **orderId** | **String**| ID of the order that needs to be deleted | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **400** | Invalid ID supplied | - |
+| **404** | Order not found | - |
+
+
+## getInventory
+
+> Map<String, Integer> getInventory()
+
+Returns pet inventories by status
+
+Returns a map of status codes to quantities
+
+### Parameters
+
+This endpoint does not need any parameter.
+
+### Return type
+
+**Map<String, Integer>**
+
+### Authorization
+
+[api_key](../README.md#api_key)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
+
+## getOrderById
+
+> Order getOrderById(orderId)
+
+Find purchase order by ID
+
+For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **orderId** | **Long**| ID of pet that needs to be fetched | |
+
+### Return type
+
+[**Order**](Order.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/xml, application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+| **400** | Invalid ID supplied | - |
+| **404** | Order not found | - |
+
+
+## placeOrder
+
+> Order placeOrder(order)
+
+Place an order for a pet
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **order** | [**Order**](Order.md)| order placed for purchasing the pet | |
+
+### Return type
+
+[**Order**](Order.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/xml, application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+| **400** | Invalid Order | - |
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/Tag.md b/samples/client/petstore/java-helidon-client/mp/docs/Tag.md
new file mode 100644
index 00000000000..5088b2dd1c3
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/Tag.md
@@ -0,0 +1,14 @@
+
+
+# Tag
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**id** | **Long** | | [optional] |
+|**name** | **String** | | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/User.md b/samples/client/petstore/java-helidon-client/mp/docs/User.md
new file mode 100644
index 00000000000..08813e4b10b
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/User.md
@@ -0,0 +1,20 @@
+
+
+# User
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**id** | **Long** | | [optional] |
+|**username** | **String** | | [optional] |
+|**firstName** | **String** | | [optional] |
+|**lastName** | **String** | | [optional] |
+|**email** | **String** | | [optional] |
+|**password** | **String** | | [optional] |
+|**phone** | **String** | | [optional] |
+|**userStatus** | **Integer** | User Status | [optional] |
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/docs/UserApi.md b/samples/client/petstore/java-helidon-client/mp/docs/UserApi.md
new file mode 100644
index 00000000000..5f33613cbe5
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/docs/UserApi.md
@@ -0,0 +1,300 @@
+# UserApi
+
+All URIs are relative to *http://petstore.swagger.io:80/v2*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+| [**createUser**](UserApi.md#createUser) | **POST** /user | Create user |
+| [**createUsersWithArrayInput**](UserApi.md#createUsersWithArrayInput) | **POST** /user/createWithArray | Creates list of users with given input array |
+| [**createUsersWithListInput**](UserApi.md#createUsersWithListInput) | **POST** /user/createWithList | Creates list of users with given input array |
+| [**deleteUser**](UserApi.md#deleteUser) | **DELETE** /user/{username} | Delete user |
+| [**getUserByName**](UserApi.md#getUserByName) | **GET** /user/{username} | Get user by user name |
+| [**loginUser**](UserApi.md#loginUser) | **GET** /user/login | Logs user into the system |
+| [**logoutUser**](UserApi.md#logoutUser) | **GET** /user/logout | Logs out current logged in user session |
+| [**updateUser**](UserApi.md#updateUser) | **PUT** /user/{username} | Updated user |
+
+
+
+## createUser
+
+> void createUser(user)
+
+Create user
+
+This can only be done by the logged in user.
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **user** | [**User**](User.md)| Created user object | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
+
+## createUsersWithArrayInput
+
+> void createUsersWithArrayInput(user)
+
+Creates list of users with given input array
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **user** | [**List<User>**](User.md)| List of user object | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
+
+## createUsersWithListInput
+
+> void createUsersWithListInput(user)
+
+Creates list of users with given input array
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **user** | [**List<User>**](User.md)| List of user object | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
+
+## deleteUser
+
+> void deleteUser(username)
+
+Delete user
+
+This can only be done by the logged in user.
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **username** | **String**| The name that needs to be deleted | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **400** | Invalid username supplied | - |
+| **404** | User not found | - |
+
+
+## getUserByName
+
+> User getUserByName(username)
+
+Get user by user name
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **username** | **String**| The name that needs to be fetched. Use user1 for testing. | |
+
+### Return type
+
+[**User**](User.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/xml, application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+| **400** | Invalid username supplied | - |
+| **404** | User not found | - |
+
+
+## loginUser
+
+> String loginUser(username, password)
+
+Logs user into the system
+
+
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **username** | **String**| The user name for login | |
+| **password** | **String**| The password for login in clear text | |
+
+### Return type
+
+**String**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/xml, application/json
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | * X-Rate-Limit - calls per hour allowed by the user
* X-Expires-After - date in UTC when token expires
|
+| **400** | Invalid username/password supplied | - |
+
+
+## logoutUser
+
+> void logoutUser()
+
+Logs out current logged in user session
+
+
+
+### Parameters
+
+This endpoint does not need any parameter.
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **200** | successful operation | - |
+
+
+## updateUser
+
+> void updateUser(username, user)
+
+Updated user
+
+This can only be done by the logged in user.
+
+### Parameters
+
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **username** | **String**| name that need to be deleted | |
+| **user** | [**User**](User.md)| Updated user object | |
+
+### Return type
+
+[**void**](Void.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: Not defined
+
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **400** | Invalid user supplied | - |
+| **404** | User not found | - |
+
diff --git a/samples/client/petstore/java-helidon-client/mp/pom.xml b/samples/client/petstore/java-helidon-client/mp/pom.xml
new file mode 100644
index 00000000000..ccf28c4c1a6
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/pom.xml
@@ -0,0 +1,78 @@
+
+ 4.0.0
+ org.openapitools
+
+ io.helidon.applications
+ helidon-mp
+ 3.0.1
+
+
+ petstore-helidon-client-mp
+ petstore-helidon-client-mp
+ 1.0.0
+ https://github.com/openapitools/openapi-generator
+ OpenAPI Java
+ jar
+
+
+
+ io.helidon.microprofile.rest-client
+ helidon-microprofile-rest-client
+
+
+ io.helidon.microprofile.config
+ helidon-microprofile-config
+
+
+ org.glassfish.jersey.ext.cdi
+ jersey-cdi1x
+
+
+ jakarta.enterprise
+ jakarta.enterprise.cdi-api
+
+
+ jakarta.json
+ jakarta.json-api
+
+
+ org.glassfish.jersey.media
+ jersey-media-json-jackson
+
+
+ org.openapitools
+ jackson-databind-nullable
+ 0.2.2
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-libs
+
+
+
+
+ org.jboss.jandex
+ jandex-maven-plugin
+
+
+ make-index
+
+
+
+
+
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/JavaTimeFormatter.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/JavaTimeFormatter.java
new file mode 100644
index 00000000000..8a222f52403
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/JavaTimeFormatter.java
@@ -0,0 +1,64 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client;
+
+import java.time.OffsetDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+
+/**
+ * Class that add parsing/formatting support for Java 8+ {@code OffsetDateTime} class.
+ * It's generated for java clients when {@code AbstractJavaCodegen#dateLibrary} specified as {@code java8}.
+ */
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaHelidonClientCodegen")
+public class JavaTimeFormatter {
+
+ private DateTimeFormatter offsetDateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
+
+ /**
+ * Get the date format used to parse/format {@code OffsetDateTime} parameters.
+ * @return DateTimeFormatter
+ */
+ public DateTimeFormatter getOffsetDateTimeFormatter() {
+ return offsetDateTimeFormatter;
+ }
+
+ /**
+ * Set the date format used to parse/format {@code OffsetDateTime} parameters.
+ * @param offsetDateTimeFormatter {@code DateTimeFormatter}
+ */
+ public void setOffsetDateTimeFormatter(DateTimeFormatter offsetDateTimeFormatter) {
+ this.offsetDateTimeFormatter = offsetDateTimeFormatter;
+ }
+
+ /**
+ * Parse the given string into {@code OffsetDateTime} object.
+ * @param str String
+ * @return {@code OffsetDateTime}
+ */
+ public OffsetDateTime parseOffsetDateTime(String str) {
+ try {
+ return OffsetDateTime.parse(str, offsetDateTimeFormatter);
+ } catch (DateTimeParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ /**
+ * Format the given {@code OffsetDateTime} object into string.
+ * @param offsetDateTime {@code OffsetDateTime}
+ * @return {@code OffsetDateTime} in string format
+ */
+ public String formatOffsetDateTime(OffsetDateTime offsetDateTime) {
+ return offsetDateTimeFormatter.format(offsetDateTime);
+ }
+}
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/RFC3339DateFormat.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/RFC3339DateFormat.java
new file mode 100644
index 00000000000..dd96c18c0d3
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/RFC3339DateFormat.java
@@ -0,0 +1,57 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client;
+
+import com.fasterxml.jackson.databind.util.StdDateFormat;
+
+import java.text.DateFormat;
+import java.text.FieldPosition;
+import java.text.ParsePosition;
+import java.util.Date;
+import java.text.DecimalFormat;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+public class RFC3339DateFormat extends DateFormat {
+ private static final long serialVersionUID = 1L;
+ private static final TimeZone TIMEZONE_Z = TimeZone.getTimeZone("UTC");
+
+ private final StdDateFormat fmt = new StdDateFormat()
+ .withTimeZone(TIMEZONE_Z)
+ .withColonInTimeZone(true);
+
+ public RFC3339DateFormat() {
+ this.calendar = new GregorianCalendar();
+ this.numberFormat = new DecimalFormat();
+ }
+
+ @Override
+ public Date parse(String source) {
+ return parse(source, new ParsePosition(0));
+ }
+
+ @Override
+ public Date parse(String source, ParsePosition pos) {
+ return fmt.parse(source, pos);
+ }
+
+ @Override
+ public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
+ return fmt.format(date, toAppendTo, fieldPosition);
+ }
+
+ @Override
+ public Object clone() {
+ return super.clone();
+ }
+}
\ No newline at end of file
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/AnotherFakeApi.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/AnotherFakeApi.java
new file mode 100644
index 00000000000..c2a678cc0f0
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/AnotherFakeApi.java
@@ -0,0 +1,49 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.api;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.MediaType;
+
+import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+
+import org.openapitools.client.model.Client;
+
+/**
+ * OpenAPI Petstore
+ *
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ */
+@RegisterRestClient
+@RegisterProvider(ApiExceptionMapper.class)
+@Path("/another-fake/dummy")
+public interface AnotherFakeApi {
+
+ /**
+ * To test special tags
+ * To test special tags and operation ID starting with number
+ */
+ @PATCH
+
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ Client call123testSpecialTags(Client client) throws ApiException, ProcessingException;
+}
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/ApiException.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/ApiException.java
new file mode 100644
index 00000000000..c05f1ebf842
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/ApiException.java
@@ -0,0 +1,30 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.api;
+
+import jakarta.ws.rs.core.Response;
+
+public class ApiException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ private final Response response;
+
+ public ApiException(Response response) {
+ super("Api response has status code " + response.getStatus());
+ this.response = response;
+ }
+
+ public Response getResponse() {
+ return this.response;
+ }
+}
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/ApiExceptionMapper.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/ApiExceptionMapper.java
new file mode 100644
index 00000000000..4c425b56695
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/ApiExceptionMapper.java
@@ -0,0 +1,33 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.api;
+
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.Provider;
+
+import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper;
+
+@Provider
+public class ApiExceptionMapper implements ResponseExceptionMapper {
+
+ @Override
+ public boolean handles(int status, MultivaluedMap headers) {
+ return status >= 400;
+ }
+
+ @Override
+ public ApiException toThrowable(Response response) {
+ return new ApiException(response);
+ }
+}
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/DefaultApi.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/DefaultApi.java
new file mode 100644
index 00000000000..a53eaf73daf
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/DefaultApi.java
@@ -0,0 +1,44 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.api;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.MediaType;
+
+import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+
+import org.openapitools.client.model.FooGetDefaultResponse;
+
+/**
+ * OpenAPI Petstore
+ *
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ */
+@RegisterRestClient
+@RegisterProvider(ApiExceptionMapper.class)
+@Path("/foo")
+public interface DefaultApi {
+
+ @GET
+
+ @Produces({ "application/json" })
+ FooGetDefaultResponse fooGet() throws ApiException, ProcessingException;
+}
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/FakeApi.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/FakeApi.java
new file mode 100644
index 00000000000..122edf22556
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/FakeApi.java
@@ -0,0 +1,169 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.api;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.MediaType;
+
+import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+
+import java.math.BigDecimal;
+import org.openapitools.client.model.Client;
+import org.openapitools.client.model.EnumClass;
+import java.io.File;
+import org.openapitools.client.model.FileSchemaTestClass;
+import org.openapitools.client.model.HealthCheckResult;
+import java.time.LocalDate;
+import java.time.OffsetDateTime;
+import org.openapitools.client.model.OuterComposite;
+import org.openapitools.client.model.OuterObjectWithEnumProperty;
+import org.openapitools.client.model.Pet;
+import org.openapitools.client.model.User;
+
+/**
+ * OpenAPI Petstore
+ *
+ *
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ */
+@RegisterRestClient
+@RegisterProvider(ApiExceptionMapper.class)
+@Path("/fake")
+public interface FakeApi {
+
+ /**
+ * Health check endpoint
+ */
+ @GET
+ @Path("/health")
+ @Produces({ "application/json" })
+ HealthCheckResult fakeHealthGet() throws ApiException, ProcessingException;
+
+ /**
+ * test http signature authentication
+ */
+ @GET
+ @Path("/http-signature-test")
+ @Consumes({ "application/json", "application/xml" })
+ void fakeHttpSignatureTest(Pet pet, @QueryParam("query_1") String query1, @HeaderParam("header_1") String header1) throws ApiException, ProcessingException;
+
+ @POST
+ @Path("/outer/boolean")
+ @Consumes({ "application/json" })
+ @Produces({ "*/*" })
+ Boolean fakeOuterBooleanSerialize(Boolean body) throws ApiException, ProcessingException;
+
+ @POST
+ @Path("/outer/composite")
+ @Consumes({ "application/json" })
+ @Produces({ "*/*" })
+ OuterComposite fakeOuterCompositeSerialize(OuterComposite outerComposite) throws ApiException, ProcessingException;
+
+ @POST
+ @Path("/outer/number")
+ @Consumes({ "application/json" })
+ @Produces({ "*/*" })
+ BigDecimal fakeOuterNumberSerialize(BigDecimal body) throws ApiException, ProcessingException;
+
+ @POST
+ @Path("/outer/string")
+ @Consumes({ "application/json" })
+ @Produces({ "*/*" })
+ String fakeOuterStringSerialize(String body) throws ApiException, ProcessingException;
+
+ @POST
+ @Path("/property/enum-int")
+ @Consumes({ "application/json" })
+ @Produces({ "*/*" })
+ OuterObjectWithEnumProperty fakePropertyEnumIntegerSerialize(OuterObjectWithEnumProperty outerObjectWithEnumProperty) throws ApiException, ProcessingException;
+
+ @PUT
+ @Path("/body-with-binary")
+ @Consumes({ "image/png" })
+ void testBodyWithBinary(File body) throws ApiException, ProcessingException;
+
+ @PUT
+ @Path("/body-with-file-schema")
+ @Consumes({ "application/json" })
+ void testBodyWithFileSchema(FileSchemaTestClass fileSchemaTestClass) throws ApiException, ProcessingException;
+
+ @PUT
+ @Path("/body-with-query-params")
+ @Consumes({ "application/json" })
+ void testBodyWithQueryParams(@QueryParam("query") String query, User user) throws ApiException, ProcessingException;
+
+ /**
+ * To test \"client\" model
+ * To test \"client\" model
+ */
+ @PATCH
+
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ Client testClientModel(Client client) throws ApiException, ProcessingException;
+
+ /**
+ * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+ * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+ */
+ @POST
+
+ @Consumes({ "application/x-www-form-urlencoded" })
+ void testEndpointParameters(@FormParam("number") BigDecimal number, @FormParam("double") Double _double, @FormParam("pattern_without_delimiter") String patternWithoutDelimiter, @FormParam("byte") byte[] _byte, @FormParam("integer") Integer integer, @FormParam("int32") Integer int32, @FormParam("int64") Long int64, @FormParam("float") Float _float, @FormParam("string") String string, @FormParam("binary") File binary, @FormParam("date") LocalDate date, @FormParam("dateTime") OffsetDateTime dateTime, @FormParam("password") String password, @FormParam("callback") String paramCallback) throws ApiException, ProcessingException;
+
+ /**
+ * To test enum parameters
+ * To test enum parameters
+ */
+ @GET
+
+ @Consumes({ "application/x-www-form-urlencoded" })
+ void testEnumParameters(@HeaderParam("enum_header_string_array") List enumHeaderStringArray, @HeaderParam("enum_header_string") String enumHeaderString, @QueryParam("enum_query_string_array") List enumQueryStringArray, @QueryParam("enum_query_string") @DefaultValue("-efg") String enumQueryString, @QueryParam("enum_query_integer") Integer enumQueryInteger, @QueryParam("enum_query_double") Double enumQueryDouble, @QueryParam("enum_query_model_array") List enumQueryModelArray, @FormParam("enum_form_string_array") List enumFormStringArray, @FormParam("enum_form_string") String enumFormString) throws ApiException, ProcessingException;
+
+ /**
+ * Fake endpoint to test group parameters (optional)
+ * Fake endpoint to test group parameters (optional)
+ */
+ @DELETE
+
+ void testGroupParameters(@QueryParam("required_string_group") Integer requiredStringGroup, @HeaderParam("required_boolean_group") Boolean requiredBooleanGroup, @QueryParam("required_int64_group") Long requiredInt64Group, @QueryParam("string_group") Integer stringGroup, @HeaderParam("boolean_group") Boolean booleanGroup, @QueryParam("int64_group") Long int64Group) throws ApiException, ProcessingException;
+
+ /**
+ * test inline additionalProperties
+ *
+ */
+ @POST
+ @Path("/inline-additionalProperties")
+ @Consumes({ "application/json" })
+ void testInlineAdditionalProperties(Map requestBody) throws ApiException, ProcessingException;
+
+ /**
+ * test json serialization of form data
+ *
+ */
+ @GET
+ @Path("/jsonFormData")
+ @Consumes({ "application/x-www-form-urlencoded" })
+ void testJsonFormData(@FormParam("param") String param, @FormParam("param2") String param2) throws ApiException, ProcessingException;
+
+ @PUT
+ @Path("/test-query-parameters")
+ void testQueryParameterCollectionFormat(@QueryParam("pipe") List pipe, @QueryParam("ioutil") List ioutil, @QueryParam("http") List http, @QueryParam("url") List url, @QueryParam("context") List context, @QueryParam("allowEmpty") String allowEmpty, @QueryParam("language") Map language) throws ApiException, ProcessingException;
+}
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java
new file mode 100644
index 00000000000..aaeb4a55e40
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/FakeClassnameTags123Api.java
@@ -0,0 +1,49 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.api;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.MediaType;
+
+import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+
+import org.openapitools.client.model.Client;
+
+/**
+ * OpenAPI Petstore
+ *
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ */
+@RegisterRestClient
+@RegisterProvider(ApiExceptionMapper.class)
+@Path("/fake_classname_test")
+public interface FakeClassnameTags123Api {
+
+ /**
+ * To test class name in snake case
+ * To test class name in snake case
+ */
+ @PATCH
+
+ @Consumes({ "application/json" })
+ @Produces({ "application/json" })
+ Client testClassname(Client client) throws ApiException, ProcessingException;
+}
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/PetApi.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/PetApi.java
new file mode 100644
index 00000000000..0248f2e6912
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/PetApi.java
@@ -0,0 +1,126 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.api;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.MediaType;
+
+import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+
+import java.io.File;
+import org.openapitools.client.model.ModelApiResponse;
+import org.openapitools.client.model.Pet;
+import java.util.Set;
+
+/**
+ * OpenAPI Petstore
+ *
+ *
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ */
+@RegisterRestClient
+@RegisterProvider(ApiExceptionMapper.class)
+@Path("")
+public interface PetApi {
+
+ /**
+ * Add a new pet to the store
+ *
+ */
+ @POST
+ @Path("/pet")
+ @Consumes({ "application/json", "application/xml" })
+ void addPet(Pet pet) throws ApiException, ProcessingException;
+
+ /**
+ * Deletes a pet
+ *
+ */
+ @DELETE
+ @Path("/pet/{petId}")
+ void deletePet(@PathParam("petId") Long petId, @HeaderParam("api_key") String apiKey) throws ApiException, ProcessingException;
+
+ /**
+ * Finds Pets by status
+ * Multiple status values can be provided with comma separated strings
+ */
+ @GET
+ @Path("/pet/findByStatus")
+ @Produces({ "application/xml", "application/json" })
+ List findPetsByStatus(@QueryParam("status") List status) throws ApiException, ProcessingException;
+
+ /**
+ * Finds Pets by tags
+ * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
+ * @deprecated
+ */
+ @Deprecated
+ @GET
+ @Path("/pet/findByTags")
+ @Produces({ "application/xml", "application/json" })
+ Set findPetsByTags(@QueryParam("tags") Set tags) throws ApiException, ProcessingException;
+
+ /**
+ * Find pet by ID
+ * Returns a single pet
+ */
+ @GET
+ @Path("/pet/{petId}")
+ @Produces({ "application/xml", "application/json" })
+ Pet getPetById(@PathParam("petId") Long petId) throws ApiException, ProcessingException;
+
+ /**
+ * Update an existing pet
+ *
+ */
+ @PUT
+ @Path("/pet")
+ @Consumes({ "application/json", "application/xml" })
+ void updatePet(Pet pet) throws ApiException, ProcessingException;
+
+ /**
+ * Updates a pet in the store with form data
+ *
+ */
+ @POST
+ @Path("/pet/{petId}")
+ @Consumes({ "application/x-www-form-urlencoded" })
+ void updatePetWithForm(@PathParam("petId") Long petId, @FormParam("name") String name, @FormParam("status") String status) throws ApiException, ProcessingException;
+
+ /**
+ * uploads an image
+ *
+ */
+ @POST
+ @Path("/pet/{petId}/uploadImage")
+ @Consumes({ "multipart/form-data" })
+ @Produces({ "application/json" })
+ ModelApiResponse uploadFile(@PathParam("petId") Long petId, @FormParam("additionalMetadata") String additionalMetadata, @FormParam("file") File _file) throws ApiException, ProcessingException;
+
+ /**
+ * uploads an image (required)
+ *
+ */
+ @POST
+ @Path("/fake/{petId}/uploadImageWithRequiredFile")
+ @Consumes({ "multipart/form-data" })
+ @Produces({ "application/json" })
+ ModelApiResponse uploadFileWithRequiredFile(@PathParam("petId") Long petId, @FormParam("requiredFile") File requiredFile, @FormParam("additionalMetadata") String additionalMetadata) throws ApiException, ProcessingException;
+}
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/StoreApi.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/StoreApi.java
new file mode 100644
index 00000000000..ff2dfbfbca6
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/StoreApi.java
@@ -0,0 +1,75 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.api;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.MediaType;
+
+import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+
+import org.openapitools.client.model.Order;
+
+/**
+ * OpenAPI Petstore
+ *
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ */
+@RegisterRestClient
+@RegisterProvider(ApiExceptionMapper.class)
+@Path("/store")
+public interface StoreApi {
+
+ /**
+ * Delete purchase order by ID
+ * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
+ */
+ @DELETE
+ @Path("/order/{order_id}")
+ void deleteOrder(@PathParam("order_id") String orderId) throws ApiException, ProcessingException;
+
+ /**
+ * Returns pet inventories by status
+ * Returns a map of status codes to quantities
+ */
+ @GET
+ @Path("/inventory")
+ @Produces({ "application/json" })
+ Map getInventory() throws ApiException, ProcessingException;
+
+ /**
+ * Find purchase order by ID
+ * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions
+ */
+ @GET
+ @Path("/order/{order_id}")
+ @Produces({ "application/xml", "application/json" })
+ Order getOrderById(@PathParam("order_id") Long orderId) throws ApiException, ProcessingException;
+
+ /**
+ * Place an order for a pet
+ *
+ */
+ @POST
+ @Path("/order")
+ @Consumes({ "application/json" })
+ @Produces({ "application/xml", "application/json" })
+ Order placeOrder(Order order) throws ApiException, ProcessingException;
+}
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/UserApi.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/UserApi.java
new file mode 100644
index 00000000000..48e64286d87
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/api/UserApi.java
@@ -0,0 +1,110 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.api;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.MediaType;
+
+import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
+import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
+
+import java.time.OffsetDateTime;
+import org.openapitools.client.model.User;
+
+/**
+ * OpenAPI Petstore
+ *
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ */
+@RegisterRestClient
+@RegisterProvider(ApiExceptionMapper.class)
+@Path("/user")
+public interface UserApi {
+
+ /**
+ * Create user
+ * This can only be done by the logged in user.
+ */
+ @POST
+
+ @Consumes({ "application/json" })
+ void createUser(User user) throws ApiException, ProcessingException;
+
+ /**
+ * Creates list of users with given input array
+ *
+ */
+ @POST
+ @Path("/createWithArray")
+ @Consumes({ "application/json" })
+ void createUsersWithArrayInput(List user) throws ApiException, ProcessingException;
+
+ /**
+ * Creates list of users with given input array
+ *
+ */
+ @POST
+ @Path("/createWithList")
+ @Consumes({ "application/json" })
+ void createUsersWithListInput(List user) throws ApiException, ProcessingException;
+
+ /**
+ * Delete user
+ * This can only be done by the logged in user.
+ */
+ @DELETE
+ @Path("/{username}")
+ void deleteUser(@PathParam("username") String username) throws ApiException, ProcessingException;
+
+ /**
+ * Get user by user name
+ *
+ */
+ @GET
+ @Path("/{username}")
+ @Produces({ "application/xml", "application/json" })
+ User getUserByName(@PathParam("username") String username) throws ApiException, ProcessingException;
+
+ /**
+ * Logs user into the system
+ *
+ */
+ @GET
+ @Path("/login")
+ @Produces({ "application/xml", "application/json" })
+ String loginUser(@QueryParam("username") String username, @QueryParam("password") String password) throws ApiException, ProcessingException;
+
+ /**
+ * Logs out current logged in user session
+ *
+ */
+ @GET
+ @Path("/logout")
+ void logoutUser() throws ApiException, ProcessingException;
+
+ /**
+ * Updated user
+ * This can only be done by the logged in user.
+ */
+ @PUT
+ @Path("/{username}")
+ @Consumes({ "application/json" })
+ void updateUser(@PathParam("username") String username, User user) throws ApiException, ProcessingException;
+}
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java
new file mode 100644
index 00000000000..abc3d296fa3
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/AdditionalPropertiesClass.java
@@ -0,0 +1,108 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+
+public class AdditionalPropertiesClass {
+
+ private Map mapProperty = null;
+
+ private Map> mapOfMapProperty = null;
+
+ /**
+ * Get mapProperty
+ * @return mapProperty
+ **/
+ public Map getMapProperty() {
+ return mapProperty;
+ }
+
+ /**
+ * Set mapProperty
+ **/
+ public void setMapProperty(Map mapProperty) {
+ this.mapProperty = mapProperty;
+ }
+
+ public AdditionalPropertiesClass mapProperty(Map mapProperty) {
+ this.mapProperty = mapProperty;
+ return this;
+ }
+
+ public AdditionalPropertiesClass putMapPropertyItem(String key, String mapPropertyItem) {
+ this.mapProperty.put(key, mapPropertyItem);
+ return this;
+ }
+
+ /**
+ * Get mapOfMapProperty
+ * @return mapOfMapProperty
+ **/
+ public Map> getMapOfMapProperty() {
+ return mapOfMapProperty;
+ }
+
+ /**
+ * Set mapOfMapProperty
+ **/
+ public void setMapOfMapProperty(Map> mapOfMapProperty) {
+ this.mapOfMapProperty = mapOfMapProperty;
+ }
+
+ public AdditionalPropertiesClass mapOfMapProperty(Map> mapOfMapProperty) {
+ this.mapOfMapProperty = mapOfMapProperty;
+ return this;
+ }
+
+ public AdditionalPropertiesClass putMapOfMapPropertyItem(String key, Map mapOfMapPropertyItem) {
+ this.mapOfMapProperty.put(key, mapOfMapPropertyItem);
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class AdditionalPropertiesClass {\n");
+
+ sb.append(" mapProperty: ").append(toIndentedString(mapProperty)).append("\n");
+ sb.append(" mapOfMapProperty: ").append(toIndentedString(mapOfMapProperty)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/AllOfWithSingleRef.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/AllOfWithSingleRef.java
new file mode 100644
index 00000000000..cb7b8b0a681
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/AllOfWithSingleRef.java
@@ -0,0 +1,97 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.openapitools.client.model.SingleRefType;
+
+
+
+
+public class AllOfWithSingleRef {
+
+ private String username;
+
+ private SingleRefType singleRefType;
+
+ /**
+ * Get username
+ * @return username
+ **/
+ public String getUsername() {
+ return username;
+ }
+
+ /**
+ * Set username
+ **/
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public AllOfWithSingleRef username(String username) {
+ this.username = username;
+ return this;
+ }
+
+ /**
+ * Get singleRefType
+ * @return singleRefType
+ **/
+ public SingleRefType getSingleRefType() {
+ return singleRefType;
+ }
+
+ /**
+ * Set singleRefType
+ **/
+ public void setSingleRefType(SingleRefType singleRefType) {
+ this.singleRefType = singleRefType;
+ }
+
+ public AllOfWithSingleRef singleRefType(SingleRefType singleRefType) {
+ this.singleRefType = singleRefType;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class AllOfWithSingleRef {\n");
+
+ sb.append(" username: ").append(toIndentedString(username)).append("\n");
+ sb.append(" singleRefType: ").append(toIndentedString(singleRefType)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Animal.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Animal.java
new file mode 100644
index 00000000000..36ecf9c54f6
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Animal.java
@@ -0,0 +1,101 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.openapitools.client.model.Cat;
+import org.openapitools.client.model.Dog;
+
+
+
+
+public class Animal {
+
+ private String className;
+
+ private String color = "red";
+
+ /**
+ * Get className
+ * @return className
+ **/
+ public String getClassName() {
+ return className;
+ }
+
+ /**
+ * Set className
+ **/
+ public void setClassName(String className) {
+ this.className = className;
+ }
+
+ public Animal className(String className) {
+ this.className = className;
+ return this;
+ }
+
+ /**
+ * Get color
+ * @return color
+ **/
+ public String getColor() {
+ return color;
+ }
+
+ /**
+ * Set color
+ **/
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public Animal color(String color) {
+ this.color = color;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Animal {\n");
+
+ sb.append(" className: ").append(toIndentedString(className)).append("\n");
+ sb.append(" color: ").append(toIndentedString(color)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java
new file mode 100644
index 00000000000..d451b999d86
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ArrayOfArrayOfNumberOnly.java
@@ -0,0 +1,81 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+
+
+
+public class ArrayOfArrayOfNumberOnly {
+
+ private List> arrayArrayNumber = null;
+
+ /**
+ * Get arrayArrayNumber
+ * @return arrayArrayNumber
+ **/
+ public List> getArrayArrayNumber() {
+ return arrayArrayNumber;
+ }
+
+ /**
+ * Set arrayArrayNumber
+ **/
+ public void setArrayArrayNumber(List> arrayArrayNumber) {
+ this.arrayArrayNumber = arrayArrayNumber;
+ }
+
+ public ArrayOfArrayOfNumberOnly arrayArrayNumber(List> arrayArrayNumber) {
+ this.arrayArrayNumber = arrayArrayNumber;
+ return this;
+ }
+
+ public ArrayOfArrayOfNumberOnly addArrayArrayNumberItem(List arrayArrayNumberItem) {
+ this.arrayArrayNumber.add(arrayArrayNumberItem);
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ArrayOfArrayOfNumberOnly {\n");
+
+ sb.append(" arrayArrayNumber: ").append(toIndentedString(arrayArrayNumber)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java
new file mode 100644
index 00000000000..3b64bf9e879
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ArrayOfNumberOnly.java
@@ -0,0 +1,81 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+
+
+
+public class ArrayOfNumberOnly {
+
+ private List arrayNumber = null;
+
+ /**
+ * Get arrayNumber
+ * @return arrayNumber
+ **/
+ public List getArrayNumber() {
+ return arrayNumber;
+ }
+
+ /**
+ * Set arrayNumber
+ **/
+ public void setArrayNumber(List arrayNumber) {
+ this.arrayNumber = arrayNumber;
+ }
+
+ public ArrayOfNumberOnly arrayNumber(List arrayNumber) {
+ this.arrayNumber = arrayNumber;
+ return this;
+ }
+
+ public ArrayOfNumberOnly addArrayNumberItem(BigDecimal arrayNumberItem) {
+ this.arrayNumber.add(arrayNumberItem);
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ArrayOfNumberOnly {\n");
+
+ sb.append(" arrayNumber: ").append(toIndentedString(arrayNumber)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ArrayTest.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ArrayTest.java
new file mode 100644
index 00000000000..ab1f6d17917
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ArrayTest.java
@@ -0,0 +1,137 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.util.ArrayList;
+import java.util.List;
+import org.openapitools.client.model.ReadOnlyFirst;
+
+
+
+
+public class ArrayTest {
+
+ private List arrayOfString = null;
+
+ private List> arrayArrayOfInteger = null;
+
+ private List> arrayArrayOfModel = null;
+
+ /**
+ * Get arrayOfString
+ * @return arrayOfString
+ **/
+ public List getArrayOfString() {
+ return arrayOfString;
+ }
+
+ /**
+ * Set arrayOfString
+ **/
+ public void setArrayOfString(List arrayOfString) {
+ this.arrayOfString = arrayOfString;
+ }
+
+ public ArrayTest arrayOfString(List arrayOfString) {
+ this.arrayOfString = arrayOfString;
+ return this;
+ }
+
+ public ArrayTest addArrayOfStringItem(String arrayOfStringItem) {
+ this.arrayOfString.add(arrayOfStringItem);
+ return this;
+ }
+
+ /**
+ * Get arrayArrayOfInteger
+ * @return arrayArrayOfInteger
+ **/
+ public List> getArrayArrayOfInteger() {
+ return arrayArrayOfInteger;
+ }
+
+ /**
+ * Set arrayArrayOfInteger
+ **/
+ public void setArrayArrayOfInteger(List> arrayArrayOfInteger) {
+ this.arrayArrayOfInteger = arrayArrayOfInteger;
+ }
+
+ public ArrayTest arrayArrayOfInteger(List> arrayArrayOfInteger) {
+ this.arrayArrayOfInteger = arrayArrayOfInteger;
+ return this;
+ }
+
+ public ArrayTest addArrayArrayOfIntegerItem(List arrayArrayOfIntegerItem) {
+ this.arrayArrayOfInteger.add(arrayArrayOfIntegerItem);
+ return this;
+ }
+
+ /**
+ * Get arrayArrayOfModel
+ * @return arrayArrayOfModel
+ **/
+ public List> getArrayArrayOfModel() {
+ return arrayArrayOfModel;
+ }
+
+ /**
+ * Set arrayArrayOfModel
+ **/
+ public void setArrayArrayOfModel(List> arrayArrayOfModel) {
+ this.arrayArrayOfModel = arrayArrayOfModel;
+ }
+
+ public ArrayTest arrayArrayOfModel(List> arrayArrayOfModel) {
+ this.arrayArrayOfModel = arrayArrayOfModel;
+ return this;
+ }
+
+ public ArrayTest addArrayArrayOfModelItem(List arrayArrayOfModelItem) {
+ this.arrayArrayOfModel.add(arrayArrayOfModelItem);
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ArrayTest {\n");
+
+ sb.append(" arrayOfString: ").append(toIndentedString(arrayOfString)).append("\n");
+ sb.append(" arrayArrayOfInteger: ").append(toIndentedString(arrayArrayOfInteger)).append("\n");
+ sb.append(" arrayArrayOfModel: ").append(toIndentedString(arrayArrayOfModel)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Capitalization.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Capitalization.java
new file mode 100644
index 00000000000..f6d3fde93d4
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Capitalization.java
@@ -0,0 +1,191 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+
+
+
+public class Capitalization {
+
+ private String smallCamel;
+
+ private String capitalCamel;
+
+ private String smallSnake;
+
+ private String capitalSnake;
+
+ private String scAETHFlowPoints;
+
+ /**
+ * Name of the pet
+ **/
+ private String ATT_NAME;
+
+ /**
+ * Get smallCamel
+ * @return smallCamel
+ **/
+ public String getSmallCamel() {
+ return smallCamel;
+ }
+
+ /**
+ * Set smallCamel
+ **/
+ public void setSmallCamel(String smallCamel) {
+ this.smallCamel = smallCamel;
+ }
+
+ public Capitalization smallCamel(String smallCamel) {
+ this.smallCamel = smallCamel;
+ return this;
+ }
+
+ /**
+ * Get capitalCamel
+ * @return capitalCamel
+ **/
+ public String getCapitalCamel() {
+ return capitalCamel;
+ }
+
+ /**
+ * Set capitalCamel
+ **/
+ public void setCapitalCamel(String capitalCamel) {
+ this.capitalCamel = capitalCamel;
+ }
+
+ public Capitalization capitalCamel(String capitalCamel) {
+ this.capitalCamel = capitalCamel;
+ return this;
+ }
+
+ /**
+ * Get smallSnake
+ * @return smallSnake
+ **/
+ public String getSmallSnake() {
+ return smallSnake;
+ }
+
+ /**
+ * Set smallSnake
+ **/
+ public void setSmallSnake(String smallSnake) {
+ this.smallSnake = smallSnake;
+ }
+
+ public Capitalization smallSnake(String smallSnake) {
+ this.smallSnake = smallSnake;
+ return this;
+ }
+
+ /**
+ * Get capitalSnake
+ * @return capitalSnake
+ **/
+ public String getCapitalSnake() {
+ return capitalSnake;
+ }
+
+ /**
+ * Set capitalSnake
+ **/
+ public void setCapitalSnake(String capitalSnake) {
+ this.capitalSnake = capitalSnake;
+ }
+
+ public Capitalization capitalSnake(String capitalSnake) {
+ this.capitalSnake = capitalSnake;
+ return this;
+ }
+
+ /**
+ * Get scAETHFlowPoints
+ * @return scAETHFlowPoints
+ **/
+ public String getScAETHFlowPoints() {
+ return scAETHFlowPoints;
+ }
+
+ /**
+ * Set scAETHFlowPoints
+ **/
+ public void setScAETHFlowPoints(String scAETHFlowPoints) {
+ this.scAETHFlowPoints = scAETHFlowPoints;
+ }
+
+ public Capitalization scAETHFlowPoints(String scAETHFlowPoints) {
+ this.scAETHFlowPoints = scAETHFlowPoints;
+ return this;
+ }
+
+ /**
+ * Name of the pet
+ * @return ATT_NAME
+ **/
+ public String getATTNAME() {
+ return ATT_NAME;
+ }
+
+ /**
+ * Set ATT_NAME
+ **/
+ public void setATTNAME(String ATT_NAME) {
+ this.ATT_NAME = ATT_NAME;
+ }
+
+ public Capitalization ATT_NAME(String ATT_NAME) {
+ this.ATT_NAME = ATT_NAME;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Capitalization {\n");
+
+ sb.append(" smallCamel: ").append(toIndentedString(smallCamel)).append("\n");
+ sb.append(" capitalCamel: ").append(toIndentedString(capitalCamel)).append("\n");
+ sb.append(" smallSnake: ").append(toIndentedString(smallSnake)).append("\n");
+ sb.append(" capitalSnake: ").append(toIndentedString(capitalSnake)).append("\n");
+ sb.append(" scAETHFlowPoints: ").append(toIndentedString(scAETHFlowPoints)).append("\n");
+ sb.append(" ATT_NAME: ").append(toIndentedString(ATT_NAME)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Cat.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Cat.java
new file mode 100644
index 00000000000..be9c6954561
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Cat.java
@@ -0,0 +1,77 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.openapitools.client.model.Animal;
+
+
+
+
+public class Cat extends Animal {
+
+ private Boolean declawed;
+
+ /**
+ * Get declawed
+ * @return declawed
+ **/
+ public Boolean getDeclawed() {
+ return declawed;
+ }
+
+ /**
+ * Set declawed
+ **/
+ public void setDeclawed(Boolean declawed) {
+ this.declawed = declawed;
+ }
+
+ public Cat declawed(Boolean declawed) {
+ this.declawed = declawed;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Cat {\n");
+ sb.append(" ").append(toIndentedString(super.toString())).append("\n");
+ sb.append(" declawed: ").append(toIndentedString(declawed)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/CatAllOf.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/CatAllOf.java
new file mode 100644
index 00000000000..2b54aad5ba3
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/CatAllOf.java
@@ -0,0 +1,73 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+
+
+
+public class CatAllOf {
+
+ private Boolean declawed;
+
+ /**
+ * Get declawed
+ * @return declawed
+ **/
+ public Boolean getDeclawed() {
+ return declawed;
+ }
+
+ /**
+ * Set declawed
+ **/
+ public void setDeclawed(Boolean declawed) {
+ this.declawed = declawed;
+ }
+
+ public CatAllOf declawed(Boolean declawed) {
+ this.declawed = declawed;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class CatAllOf {\n");
+
+ sb.append(" declawed: ").append(toIndentedString(declawed)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Category.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Category.java
new file mode 100644
index 00000000000..8da99011104
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Category.java
@@ -0,0 +1,96 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+
+
+
+public class Category {
+
+ private Long id;
+
+ private String name = "default-name";
+
+ /**
+ * Get id
+ * @return id
+ **/
+ public Long getId() {
+ return id;
+ }
+
+ /**
+ * Set id
+ **/
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Category id(Long id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Get name
+ * @return name
+ **/
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set name
+ **/
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Category name(String name) {
+ this.name = name;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Category {\n");
+
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ClassModel.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ClassModel.java
new file mode 100644
index 00000000000..de44db959bc
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/ClassModel.java
@@ -0,0 +1,76 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+
+
+/**
+ * Model for testing model with \"_class\" property
+ **/
+
+public class ClassModel {
+
+ private String propertyClass;
+
+ /**
+ * Get propertyClass
+ * @return propertyClass
+ **/
+ public String getPropertyClass() {
+ return propertyClass;
+ }
+
+ /**
+ * Set propertyClass
+ **/
+ public void setPropertyClass(String propertyClass) {
+ this.propertyClass = propertyClass;
+ }
+
+ public ClassModel propertyClass(String propertyClass) {
+ this.propertyClass = propertyClass;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ClassModel {\n");
+
+ sb.append(" propertyClass: ").append(toIndentedString(propertyClass)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Client.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Client.java
new file mode 100644
index 00000000000..0ad715df8de
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Client.java
@@ -0,0 +1,73 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+
+
+
+public class Client {
+
+ private String client;
+
+ /**
+ * Get client
+ * @return client
+ **/
+ public String getClient() {
+ return client;
+ }
+
+ /**
+ * Set client
+ **/
+ public void setClient(String client) {
+ this.client = client;
+ }
+
+ public Client client(String client) {
+ this.client = client;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Client {\n");
+
+ sb.append(" client: ").append(toIndentedString(client)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/DeprecatedObject.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/DeprecatedObject.java
new file mode 100644
index 00000000000..aaaed8e7f3e
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/DeprecatedObject.java
@@ -0,0 +1,73 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+
+
+
+public class DeprecatedObject {
+
+ private String name;
+
+ /**
+ * Get name
+ * @return name
+ **/
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set name
+ **/
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public DeprecatedObject name(String name) {
+ this.name = name;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class DeprecatedObject {\n");
+
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Dog.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Dog.java
new file mode 100644
index 00000000000..069dab8392d
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Dog.java
@@ -0,0 +1,77 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.openapitools.client.model.Animal;
+
+
+
+
+public class Dog extends Animal {
+
+ private String breed;
+
+ /**
+ * Get breed
+ * @return breed
+ **/
+ public String getBreed() {
+ return breed;
+ }
+
+ /**
+ * Set breed
+ **/
+ public void setBreed(String breed) {
+ this.breed = breed;
+ }
+
+ public Dog breed(String breed) {
+ this.breed = breed;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Dog {\n");
+ sb.append(" ").append(toIndentedString(super.toString())).append("\n");
+ sb.append(" breed: ").append(toIndentedString(breed)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/DogAllOf.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/DogAllOf.java
new file mode 100644
index 00000000000..5dc63ce0380
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/DogAllOf.java
@@ -0,0 +1,73 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+
+
+
+public class DogAllOf {
+
+ private String breed;
+
+ /**
+ * Get breed
+ * @return breed
+ **/
+ public String getBreed() {
+ return breed;
+ }
+
+ /**
+ * Set breed
+ **/
+ public void setBreed(String breed) {
+ this.breed = breed;
+ }
+
+ public DogAllOf breed(String breed) {
+ this.breed = breed;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class DogAllOf {\n");
+
+ sb.append(" breed: ").append(toIndentedString(breed)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/EnumArrays.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/EnumArrays.java
new file mode 100644
index 00000000000..1a9c48c72cd
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/EnumArrays.java
@@ -0,0 +1,145 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.util.ArrayList;
+import java.util.List;
+
+
+
+
+public class EnumArrays {
+
+public enum JustSymbolEnum {
+
+ GREATER_THAN_OR_EQUAL_TO(String.valueOf(">=")), DOLLAR(String.valueOf("$"));
+
+ String value;
+
+ JustSymbolEnum (String v) {
+ value = v;
+ }
+
+ public String value() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+}
+
+ private JustSymbolEnum justSymbol;
+
+public enum ArrayEnumEnum {
+
+ FISH(String.valueOf("fish")), CRAB(String.valueOf("crab"));
+
+ String value;
+
+ ArrayEnumEnum (String v) {
+ value = v;
+ }
+
+ public String value() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+}
+
+ private List arrayEnum = null;
+
+ /**
+ * Get justSymbol
+ * @return justSymbol
+ **/
+ public JustSymbolEnum getJustSymbol() {
+ return justSymbol;
+ }
+
+ /**
+ * Set justSymbol
+ **/
+ public void setJustSymbol(JustSymbolEnum justSymbol) {
+ this.justSymbol = justSymbol;
+ }
+
+ public EnumArrays justSymbol(JustSymbolEnum justSymbol) {
+ this.justSymbol = justSymbol;
+ return this;
+ }
+
+ /**
+ * Get arrayEnum
+ * @return arrayEnum
+ **/
+ public List getArrayEnum() {
+ return arrayEnum;
+ }
+
+ /**
+ * Set arrayEnum
+ **/
+ public void setArrayEnum(List arrayEnum) {
+ this.arrayEnum = arrayEnum;
+ }
+
+ public EnumArrays arrayEnum(List arrayEnum) {
+ this.arrayEnum = arrayEnum;
+ return this;
+ }
+
+ public EnumArrays addArrayEnumItem(ArrayEnumEnum arrayEnumItem) {
+ this.arrayEnum.add(arrayEnumItem);
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class EnumArrays {\n");
+
+ sb.append(" justSymbol: ").append(toIndentedString(justSymbol)).append("\n");
+ sb.append(" arrayEnum: ").append(toIndentedString(arrayEnum)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/EnumClass.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/EnumClass.java
new file mode 100644
index 00000000000..eed52272f70
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/EnumClass.java
@@ -0,0 +1,52 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Gets or Sets EnumClass
+ */
+public enum EnumClass {
+
+ _ABC("_abc"),
+
+ _EFG("-efg"),
+
+ _XYZ_("(xyz)");
+
+ private String value;
+
+ EnumClass(String value) {
+ this.value = value;
+ }
+
+ @Override
+ @JsonValue
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static EnumClass fromValue(String text) {
+ for (EnumClass b : EnumClass.values()) {
+ if (String.valueOf(b.value).equals(text)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + text + "'");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/EnumTest.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/EnumTest.java
new file mode 100644
index 00000000000..e234097abc2
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/EnumTest.java
@@ -0,0 +1,326 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.openapitools.client.model.OuterEnum;
+import org.openapitools.client.model.OuterEnumDefaultValue;
+import org.openapitools.client.model.OuterEnumInteger;
+import org.openapitools.client.model.OuterEnumIntegerDefaultValue;
+import org.openapitools.jackson.nullable.JsonNullable;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.util.NoSuchElementException;
+
+
+
+
+public class EnumTest {
+
+public enum EnumStringEnum {
+
+ UPPER(String.valueOf("UPPER")), LOWER(String.valueOf("lower")), EMPTY(String.valueOf(""));
+
+ String value;
+
+ EnumStringEnum (String v) {
+ value = v;
+ }
+
+ public String value() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+}
+
+ private EnumStringEnum enumString;
+
+public enum EnumStringRequiredEnum {
+
+ UPPER(String.valueOf("UPPER")), LOWER(String.valueOf("lower")), EMPTY(String.valueOf(""));
+
+ String value;
+
+ EnumStringRequiredEnum (String v) {
+ value = v;
+ }
+
+ public String value() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+}
+
+ private EnumStringRequiredEnum enumStringRequired;
+
+public enum EnumIntegerEnum {
+
+ NUMBER_1(Integer.valueOf(1)), NUMBER_MINUS_1(Integer.valueOf(-1));
+
+ Integer value;
+
+ EnumIntegerEnum (Integer v) {
+ value = v;
+ }
+
+ public Integer value() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+}
+
+ private EnumIntegerEnum enumInteger;
+
+public enum EnumNumberEnum {
+
+ NUMBER_1_DOT_1(Double.valueOf(1.1)), NUMBER_MINUS_1_DOT_2(Double.valueOf(-1.2));
+
+ Double value;
+
+ EnumNumberEnum (Double v) {
+ value = v;
+ }
+
+ public Double value() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+}
+
+ private EnumNumberEnum enumNumber;
+
+ private OuterEnum outerEnum;
+
+ private OuterEnumInteger outerEnumInteger;
+
+ private OuterEnumDefaultValue outerEnumDefaultValue = OuterEnumDefaultValue.PLACED;
+
+ private OuterEnumIntegerDefaultValue outerEnumIntegerDefaultValue = OuterEnumIntegerDefaultValue.NUMBER_0;
+
+ /**
+ * Get enumString
+ * @return enumString
+ **/
+ public EnumStringEnum getEnumString() {
+ return enumString;
+ }
+
+ /**
+ * Set enumString
+ **/
+ public void setEnumString(EnumStringEnum enumString) {
+ this.enumString = enumString;
+ }
+
+ public EnumTest enumString(EnumStringEnum enumString) {
+ this.enumString = enumString;
+ return this;
+ }
+
+ /**
+ * Get enumStringRequired
+ * @return enumStringRequired
+ **/
+ public EnumStringRequiredEnum getEnumStringRequired() {
+ return enumStringRequired;
+ }
+
+ /**
+ * Set enumStringRequired
+ **/
+ public void setEnumStringRequired(EnumStringRequiredEnum enumStringRequired) {
+ this.enumStringRequired = enumStringRequired;
+ }
+
+ public EnumTest enumStringRequired(EnumStringRequiredEnum enumStringRequired) {
+ this.enumStringRequired = enumStringRequired;
+ return this;
+ }
+
+ /**
+ * Get enumInteger
+ * @return enumInteger
+ **/
+ public EnumIntegerEnum getEnumInteger() {
+ return enumInteger;
+ }
+
+ /**
+ * Set enumInteger
+ **/
+ public void setEnumInteger(EnumIntegerEnum enumInteger) {
+ this.enumInteger = enumInteger;
+ }
+
+ public EnumTest enumInteger(EnumIntegerEnum enumInteger) {
+ this.enumInteger = enumInteger;
+ return this;
+ }
+
+ /**
+ * Get enumNumber
+ * @return enumNumber
+ **/
+ public EnumNumberEnum getEnumNumber() {
+ return enumNumber;
+ }
+
+ /**
+ * Set enumNumber
+ **/
+ public void setEnumNumber(EnumNumberEnum enumNumber) {
+ this.enumNumber = enumNumber;
+ }
+
+ public EnumTest enumNumber(EnumNumberEnum enumNumber) {
+ this.enumNumber = enumNumber;
+ return this;
+ }
+
+ /**
+ * Get outerEnum
+ * @return outerEnum
+ **/
+ public OuterEnum getOuterEnum() {
+ return outerEnum;
+ }
+
+ /**
+ * Set outerEnum
+ **/
+ public void setOuterEnum(OuterEnum outerEnum) {
+ this.outerEnum = outerEnum;
+ }
+
+ public EnumTest outerEnum(OuterEnum outerEnum) {
+ this.outerEnum = outerEnum;
+ return this;
+ }
+
+ /**
+ * Get outerEnumInteger
+ * @return outerEnumInteger
+ **/
+ public OuterEnumInteger getOuterEnumInteger() {
+ return outerEnumInteger;
+ }
+
+ /**
+ * Set outerEnumInteger
+ **/
+ public void setOuterEnumInteger(OuterEnumInteger outerEnumInteger) {
+ this.outerEnumInteger = outerEnumInteger;
+ }
+
+ public EnumTest outerEnumInteger(OuterEnumInteger outerEnumInteger) {
+ this.outerEnumInteger = outerEnumInteger;
+ return this;
+ }
+
+ /**
+ * Get outerEnumDefaultValue
+ * @return outerEnumDefaultValue
+ **/
+ public OuterEnumDefaultValue getOuterEnumDefaultValue() {
+ return outerEnumDefaultValue;
+ }
+
+ /**
+ * Set outerEnumDefaultValue
+ **/
+ public void setOuterEnumDefaultValue(OuterEnumDefaultValue outerEnumDefaultValue) {
+ this.outerEnumDefaultValue = outerEnumDefaultValue;
+ }
+
+ public EnumTest outerEnumDefaultValue(OuterEnumDefaultValue outerEnumDefaultValue) {
+ this.outerEnumDefaultValue = outerEnumDefaultValue;
+ return this;
+ }
+
+ /**
+ * Get outerEnumIntegerDefaultValue
+ * @return outerEnumIntegerDefaultValue
+ **/
+ public OuterEnumIntegerDefaultValue getOuterEnumIntegerDefaultValue() {
+ return outerEnumIntegerDefaultValue;
+ }
+
+ /**
+ * Set outerEnumIntegerDefaultValue
+ **/
+ public void setOuterEnumIntegerDefaultValue(OuterEnumIntegerDefaultValue outerEnumIntegerDefaultValue) {
+ this.outerEnumIntegerDefaultValue = outerEnumIntegerDefaultValue;
+ }
+
+ public EnumTest outerEnumIntegerDefaultValue(OuterEnumIntegerDefaultValue outerEnumIntegerDefaultValue) {
+ this.outerEnumIntegerDefaultValue = outerEnumIntegerDefaultValue;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class EnumTest {\n");
+
+ sb.append(" enumString: ").append(toIndentedString(enumString)).append("\n");
+ sb.append(" enumStringRequired: ").append(toIndentedString(enumStringRequired)).append("\n");
+ sb.append(" enumInteger: ").append(toIndentedString(enumInteger)).append("\n");
+ sb.append(" enumNumber: ").append(toIndentedString(enumNumber)).append("\n");
+ sb.append(" outerEnum: ").append(toIndentedString(outerEnum)).append("\n");
+ sb.append(" outerEnumInteger: ").append(toIndentedString(outerEnumInteger)).append("\n");
+ sb.append(" outerEnumDefaultValue: ").append(toIndentedString(outerEnumDefaultValue)).append("\n");
+ sb.append(" outerEnumIntegerDefaultValue: ").append(toIndentedString(outerEnumIntegerDefaultValue)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/FileSchemaTestClass.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/FileSchemaTestClass.java
new file mode 100644
index 00000000000..dd3716a2b12
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/FileSchemaTestClass.java
@@ -0,0 +1,104 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.util.ArrayList;
+import java.util.List;
+import org.openapitools.client.model.ModelFile;
+
+
+
+
+public class FileSchemaTestClass {
+
+ private ModelFile _file;
+
+ private List files = null;
+
+ /**
+ * Get _file
+ * @return _file
+ **/
+ public ModelFile getFile() {
+ return _file;
+ }
+
+ /**
+ * Set _file
+ **/
+ public void setFile(ModelFile _file) {
+ this._file = _file;
+ }
+
+ public FileSchemaTestClass _file(ModelFile _file) {
+ this._file = _file;
+ return this;
+ }
+
+ /**
+ * Get files
+ * @return files
+ **/
+ public List getFiles() {
+ return files;
+ }
+
+ /**
+ * Set files
+ **/
+ public void setFiles(List files) {
+ this.files = files;
+ }
+
+ public FileSchemaTestClass files(List files) {
+ this.files = files;
+ return this;
+ }
+
+ public FileSchemaTestClass addFilesItem(ModelFile filesItem) {
+ this.files.add(filesItem);
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FileSchemaTestClass {\n");
+
+ sb.append(" _file: ").append(toIndentedString(_file)).append("\n");
+ sb.append(" files: ").append(toIndentedString(files)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Foo.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Foo.java
new file mode 100644
index 00000000000..fcafaf7682c
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/Foo.java
@@ -0,0 +1,73 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+
+
+
+public class Foo {
+
+ private String bar = "bar";
+
+ /**
+ * Get bar
+ * @return bar
+ **/
+ public String getBar() {
+ return bar;
+ }
+
+ /**
+ * Set bar
+ **/
+ public void setBar(String bar) {
+ this.bar = bar;
+ }
+
+ public Foo bar(String bar) {
+ this.bar = bar;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Foo {\n");
+
+ sb.append(" bar: ").append(toIndentedString(bar)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/FooGetDefaultResponse.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/FooGetDefaultResponse.java
new file mode 100644
index 00000000000..27971dae916
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/FooGetDefaultResponse.java
@@ -0,0 +1,74 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.openapitools.client.model.Foo;
+
+
+
+
+public class FooGetDefaultResponse {
+
+ private Foo string;
+
+ /**
+ * Get string
+ * @return string
+ **/
+ public Foo getString() {
+ return string;
+ }
+
+ /**
+ * Set string
+ **/
+ public void setString(Foo string) {
+ this.string = string;
+ }
+
+ public FooGetDefaultResponse string(Foo string) {
+ this.string = string;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FooGetDefaultResponse {\n");
+
+ sb.append(" string: ").append(toIndentedString(string)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/FormatTest.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/FormatTest.java
new file mode 100644
index 00000000000..6f6b62d497c
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/FormatTest.java
@@ -0,0 +1,439 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.io.File;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.OffsetDateTime;
+import java.util.UUID;
+
+
+
+
+public class FormatTest {
+
+ private Integer integer;
+
+ private Integer int32;
+
+ private Long int64;
+
+ private BigDecimal number;
+
+ private Float _float;
+
+ private Double _double;
+
+ private BigDecimal decimal;
+
+ private String string;
+
+ private byte[] _byte;
+
+ private File binary;
+
+ private LocalDate date;
+
+ private OffsetDateTime dateTime;
+
+ private UUID uuid;
+
+ private String password;
+
+ /**
+ * A string that is a 10 digit number. Can have leading zeros.
+ **/
+ private String patternWithDigits;
+
+ /**
+ * A string starting with 'image_' (case insensitive) and one to three digits following i.e. Image_01.
+ **/
+ private String patternWithDigitsAndDelimiter;
+
+ /**
+ * Get integer
+ * minimum: 10
+ * maximum: 100
+ * @return integer
+ **/
+ public Integer getInteger() {
+ return integer;
+ }
+
+ /**
+ * Set integer
+ **/
+ public void setInteger(Integer integer) {
+ this.integer = integer;
+ }
+
+ public FormatTest integer(Integer integer) {
+ this.integer = integer;
+ return this;
+ }
+
+ /**
+ * Get int32
+ * minimum: 20
+ * maximum: 200
+ * @return int32
+ **/
+ public Integer getInt32() {
+ return int32;
+ }
+
+ /**
+ * Set int32
+ **/
+ public void setInt32(Integer int32) {
+ this.int32 = int32;
+ }
+
+ public FormatTest int32(Integer int32) {
+ this.int32 = int32;
+ return this;
+ }
+
+ /**
+ * Get int64
+ * @return int64
+ **/
+ public Long getInt64() {
+ return int64;
+ }
+
+ /**
+ * Set int64
+ **/
+ public void setInt64(Long int64) {
+ this.int64 = int64;
+ }
+
+ public FormatTest int64(Long int64) {
+ this.int64 = int64;
+ return this;
+ }
+
+ /**
+ * Get number
+ * minimum: 32.1
+ * maximum: 543.2
+ * @return number
+ **/
+ public BigDecimal getNumber() {
+ return number;
+ }
+
+ /**
+ * Set number
+ **/
+ public void setNumber(BigDecimal number) {
+ this.number = number;
+ }
+
+ public FormatTest number(BigDecimal number) {
+ this.number = number;
+ return this;
+ }
+
+ /**
+ * Get _float
+ * minimum: 54.3
+ * maximum: 987.6
+ * @return _float
+ **/
+ public Float getFloat() {
+ return _float;
+ }
+
+ /**
+ * Set _float
+ **/
+ public void setFloat(Float _float) {
+ this._float = _float;
+ }
+
+ public FormatTest _float(Float _float) {
+ this._float = _float;
+ return this;
+ }
+
+ /**
+ * Get _double
+ * minimum: 67.8
+ * maximum: 123.4
+ * @return _double
+ **/
+ public Double getDouble() {
+ return _double;
+ }
+
+ /**
+ * Set _double
+ **/
+ public void setDouble(Double _double) {
+ this._double = _double;
+ }
+
+ public FormatTest _double(Double _double) {
+ this._double = _double;
+ return this;
+ }
+
+ /**
+ * Get decimal
+ * @return decimal
+ **/
+ public BigDecimal getDecimal() {
+ return decimal;
+ }
+
+ /**
+ * Set decimal
+ **/
+ public void setDecimal(BigDecimal decimal) {
+ this.decimal = decimal;
+ }
+
+ public FormatTest decimal(BigDecimal decimal) {
+ this.decimal = decimal;
+ return this;
+ }
+
+ /**
+ * Get string
+ * @return string
+ **/
+ public String getString() {
+ return string;
+ }
+
+ /**
+ * Set string
+ **/
+ public void setString(String string) {
+ this.string = string;
+ }
+
+ public FormatTest string(String string) {
+ this.string = string;
+ return this;
+ }
+
+ /**
+ * Get _byte
+ * @return _byte
+ **/
+ public byte[] getByte() {
+ return _byte;
+ }
+
+ /**
+ * Set _byte
+ **/
+ public void setByte(byte[] _byte) {
+ this._byte = _byte;
+ }
+
+ public FormatTest _byte(byte[] _byte) {
+ this._byte = _byte;
+ return this;
+ }
+
+ /**
+ * Get binary
+ * @return binary
+ **/
+ public File getBinary() {
+ return binary;
+ }
+
+ /**
+ * Set binary
+ **/
+ public void setBinary(File binary) {
+ this.binary = binary;
+ }
+
+ public FormatTest binary(File binary) {
+ this.binary = binary;
+ return this;
+ }
+
+ /**
+ * Get date
+ * @return date
+ **/
+ public LocalDate getDate() {
+ return date;
+ }
+
+ /**
+ * Set date
+ **/
+ public void setDate(LocalDate date) {
+ this.date = date;
+ }
+
+ public FormatTest date(LocalDate date) {
+ this.date = date;
+ return this;
+ }
+
+ /**
+ * Get dateTime
+ * @return dateTime
+ **/
+ public OffsetDateTime getDateTime() {
+ return dateTime;
+ }
+
+ /**
+ * Set dateTime
+ **/
+ public void setDateTime(OffsetDateTime dateTime) {
+ this.dateTime = dateTime;
+ }
+
+ public FormatTest dateTime(OffsetDateTime dateTime) {
+ this.dateTime = dateTime;
+ return this;
+ }
+
+ /**
+ * Get uuid
+ * @return uuid
+ **/
+ public UUID getUuid() {
+ return uuid;
+ }
+
+ /**
+ * Set uuid
+ **/
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+ public FormatTest uuid(UUID uuid) {
+ this.uuid = uuid;
+ return this;
+ }
+
+ /**
+ * Get password
+ * @return password
+ **/
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * Set password
+ **/
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public FormatTest password(String password) {
+ this.password = password;
+ return this;
+ }
+
+ /**
+ * A string that is a 10 digit number. Can have leading zeros.
+ * @return patternWithDigits
+ **/
+ public String getPatternWithDigits() {
+ return patternWithDigits;
+ }
+
+ /**
+ * Set patternWithDigits
+ **/
+ public void setPatternWithDigits(String patternWithDigits) {
+ this.patternWithDigits = patternWithDigits;
+ }
+
+ public FormatTest patternWithDigits(String patternWithDigits) {
+ this.patternWithDigits = patternWithDigits;
+ return this;
+ }
+
+ /**
+ * A string starting with 'image_' (case insensitive) and one to three digits following i.e. Image_01.
+ * @return patternWithDigitsAndDelimiter
+ **/
+ public String getPatternWithDigitsAndDelimiter() {
+ return patternWithDigitsAndDelimiter;
+ }
+
+ /**
+ * Set patternWithDigitsAndDelimiter
+ **/
+ public void setPatternWithDigitsAndDelimiter(String patternWithDigitsAndDelimiter) {
+ this.patternWithDigitsAndDelimiter = patternWithDigitsAndDelimiter;
+ }
+
+ public FormatTest patternWithDigitsAndDelimiter(String patternWithDigitsAndDelimiter) {
+ this.patternWithDigitsAndDelimiter = patternWithDigitsAndDelimiter;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FormatTest {\n");
+
+ sb.append(" integer: ").append(toIndentedString(integer)).append("\n");
+ sb.append(" int32: ").append(toIndentedString(int32)).append("\n");
+ sb.append(" int64: ").append(toIndentedString(int64)).append("\n");
+ sb.append(" number: ").append(toIndentedString(number)).append("\n");
+ sb.append(" _float: ").append(toIndentedString(_float)).append("\n");
+ sb.append(" _double: ").append(toIndentedString(_double)).append("\n");
+ sb.append(" decimal: ").append(toIndentedString(decimal)).append("\n");
+ sb.append(" string: ").append(toIndentedString(string)).append("\n");
+ sb.append(" _byte: ").append(toIndentedString(_byte)).append("\n");
+ sb.append(" binary: ").append(toIndentedString(binary)).append("\n");
+ sb.append(" date: ").append(toIndentedString(date)).append("\n");
+ sb.append(" dateTime: ").append(toIndentedString(dateTime)).append("\n");
+ sb.append(" uuid: ").append(toIndentedString(uuid)).append("\n");
+ sb.append(" password: ").append(toIndentedString(password)).append("\n");
+ sb.append(" patternWithDigits: ").append(toIndentedString(patternWithDigits)).append("\n");
+ sb.append(" patternWithDigitsAndDelimiter: ").append(toIndentedString(patternWithDigitsAndDelimiter)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java
new file mode 100644
index 00000000000..72566c02dde
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/HasOnlyReadOnly.java
@@ -0,0 +1,74 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+
+
+
+public class HasOnlyReadOnly {
+
+ private String bar;
+
+ private String foo;
+
+ /**
+ * Get bar
+ * @return bar
+ **/
+ public String getBar() {
+ return bar;
+ }
+
+
+ /**
+ * Get foo
+ * @return foo
+ **/
+ public String getFoo() {
+ return foo;
+ }
+
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class HasOnlyReadOnly {\n");
+
+ sb.append(" bar: ").append(toIndentedString(bar)).append("\n");
+ sb.append(" foo: ").append(toIndentedString(foo)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/HealthCheckResult.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/HealthCheckResult.java
new file mode 100644
index 00000000000..48cec9f2dab
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/HealthCheckResult.java
@@ -0,0 +1,80 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.openapitools.jackson.nullable.JsonNullable;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.util.NoSuchElementException;
+
+
+
+/**
+ * Just a string to inform instance is up and running. Make it nullable in hope to get it as pointer in generated model.
+ **/
+
+public class HealthCheckResult {
+
+ private String nullableMessage;
+
+ /**
+ * Get nullableMessage
+ * @return nullableMessage
+ **/
+ public String getNullableMessage() {
+ return nullableMessage;
+ }
+
+ /**
+ * Set nullableMessage
+ **/
+ public void setNullableMessage(String nullableMessage) {
+ this.nullableMessage = nullableMessage;
+ }
+
+ public HealthCheckResult nullableMessage(String nullableMessage) {
+ this.nullableMessage = nullableMessage;
+ return this;
+ }
+
+
+ /**
+ * Create a string representation of this pojo.
+ **/
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class HealthCheckResult {\n");
+
+ sb.append(" nullableMessage: ").append(toIndentedString(nullableMessage)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private static String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
+
diff --git a/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/MapTest.java b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/MapTest.java
new file mode 100644
index 00000000000..ec54a8ae421
--- /dev/null
+++ b/samples/client/petstore/java-helidon-client/mp/src/main/java/org/openapitools/client/model/MapTest.java
@@ -0,0 +1,185 @@
+/**
+ * OpenAPI Petstore
+ * This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+ *
+ * The version of the OpenAPI document: 1.0.0
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.openapitools.client.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+
+public class MapTest {
+
+ private Map> mapMapOfString = null;
+
+public enum InnerEnum {
+
+ UPPER(String.valueOf("UPPER")), LOWER(String.valueOf("lower"));
+
+ String value;
+
+ InnerEnum (String v) {
+ value = v;
+ }
+
+ public String value() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+}
+
+ private Map mapOfEnumString = null;
+
+ private Map directMap = null;
+
+ private Map indirectMap = null;
+
+ /**
+ * Get mapMapOfString
+ * @return mapMapOfString
+ **/
+ public Map> getMapMapOfString() {
+ return mapMapOfString;
+ }
+
+ /**
+ * Set mapMapOfString
+ **/
+ public void setMapMapOfString(Map> mapMapOfString) {
+ this.mapMapOfString = mapMapOfString;
+ }
+
+ public MapTest mapMapOfString(Map> mapMapOfString) {
+ this.mapMapOfString = mapMapOfString;
+ return this;
+ }
+
+ public MapTest putMapMapOfStringItem(String key, Map mapMapOfStringItem) {
+ this.mapMapOfString.put(key, mapMapOfStringItem);
+ return this;
+ }
+
+ /**
+ * Get mapOfEnumString
+ * @return mapOfEnumString
+ **/
+ public Map getMapOfEnumString() {
+ return mapOfEnumString;
+ }
+
+ /**
+ * Set mapOfEnumString
+ **/
+ public void setMapOfEnumString(Map mapOfEnumString) {
+ this.mapOfEnumString = mapOfEnumString;
+ }
+
+ public MapTest mapOfEnumString(Map mapOfEnumString) {
+ this.mapOfEnumString = mapOfEnumString;
+ return this;
+ }
+
+ public MapTest putMapOfEnumStringItem(String key, InnerEnum mapOfEnumStringItem) {
+ this.mapOfEnumString.put(key, mapOfEnumStringItem);
+ return this;
+ }
+
+ /**
+ * Get directMap
+ * @return directMap
+ **/
+ public Map getDirectMap() {
+ return directMap;
+ }
+
+ /**
+ * Set directMap
+ **/
+ public void setDirectMap(Map directMap) {
+ this.directMap = directMap;
+ }
+
+ public MapTest directMap(Map directMap) {
+ this.directMap = directMap;
+ return this;
+ }
+
+ public MapTest putDirectMapItem(String key, Boolean directMapItem) {
+ this.directMap.put(key, directMapItem);
+ return this;
+ }
+
+ /**
+ * Get indirectMap
+ * @return indirectMap
+ **/
+ public Map