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}}