Skip to content

Commit

Permalink
Allow selection of MP REST API version for MicroProfile REST client g… (
Browse files Browse the repository at this point in the history
OpenAPITools#12043)

* Allow selection of MP REST API version for MicroProfile REST client generation

* fix typo in pom.xml

* fix typo in pom.xml, update samples

* add exception when incorrect MP Rest Client version is chosen
  • Loading branch information
aserkes authored and rk0n committed Apr 24, 2022
1 parent 859bfa0 commit 0cb59fc
Show file tree
Hide file tree
Showing 12 changed files with 478 additions and 89 deletions.
1 change: 1 addition & 0 deletions docs/generators/java.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|licenseName|The name of the license| |Unlicense|
|licenseUrl|The URL of the license| |http://unlicense.org|
|microprofileFramework|Framework for microprofile. Possible values "kumuluzee"| |null|
|microprofileRestClientVersion|Version of MicroProfile Rest Client API.| |null|
|modelPackage|package for generated models| |org.openapitools.client.model|
|openApiNullable|Enable OpenAPI Jackson Nullable library| |true|
|parcelableModel|Whether to generate models for Android that implement Parcelable with the okhttp-gson library.| |false|
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ public class JavaClientCodegen extends AbstractJavaCodegen
public static final String VERTX = "vertx";
public static final String MICROPROFILE = "microprofile";
public static final String APACHE = "apache-httpclient";
public static final String MICROPROFILE_REST_CLIENT_VERSION = "microprofileRestClientVersion";
public static final String MICROPROFILE_REST_CLIENT_DEFAULT_VERSION = "2.0";
public static final String MICROPROFILE_REST_CLIENT_DEFAULT_ROOT_PACKAGE = "javax";

public static final String SERIALIZATION_LIBRARY_GSON = "gson";
public static final String SERIALIZATION_LIBRARY_JACKSON = "jackson";
Expand Down Expand Up @@ -122,6 +125,18 @@ public class JavaClientCodegen extends AbstractJavaCodegen
protected String authFolder;
protected String serializationLibrary = null;
protected boolean useOneOfDiscriminatorLookup = false; // use oneOf discriminator's mapping for model lookup
protected String rootJavaEEPackage;
protected Map<String, MpRestClientVersion> mpRestClientVersions = new HashMap<>();

private static class MpRestClientVersion {
public final String rootPackage;
public final String pomTemplate;

public MpRestClientVersion(String rootPackage, String pomTemplate) {
this.rootPackage = rootPackage;
this.pomTemplate = pomTemplate;
}
}

public JavaClientCodegen() {
super();
Expand All @@ -138,6 +153,7 @@ public JavaClientCodegen() {
artifactId = "openapi-java-client";
apiPackage = "org.openapitools.client.api";
modelPackage = "org.openapitools.client.model";
rootJavaEEPackage = MICROPROFILE_REST_CLIENT_DEFAULT_ROOT_PACKAGE;

// cliOptions default redefinition need to be updated
updateOption(CodegenConstants.INVOKER_PACKAGE, this.getInvokerPackage());
Expand Down Expand Up @@ -166,6 +182,7 @@ public JavaClientCodegen() {
cliOptions.add(CliOption.newString(ERROR_OBJECT_TYPE, "Error Object type. (This option is for okhttp-gson-next-gen only)"));
cliOptions.add(CliOption.newString(CONFIG_KEY, "Config key in @RegisterRestClient. Default to none. Only `microprofile` supports this option."));
cliOptions.add(CliOption.newBoolean(CodegenConstants.USE_ONEOF_DISCRIMINATOR_LOOKUP, CodegenConstants.USE_ONEOF_DISCRIMINATOR_LOOKUP_DESC + " Only jersey2, jersey3, native, okhttp-gson support this option."));
cliOptions.add(CliOption.newString(MICROPROFILE_REST_CLIENT_VERSION, "Version of MicroProfile Rest Client API."));

supportedLibraries.put(JERSEY1, "HTTP client: Jersey client 1.19.x. JSON processing: Jackson 2.9.x. Enable gzip request encoding using '-DuseGzipFeature=true'. IMPORTANT NOTE: jersey 1.x is no longer actively maintained so please upgrade to 'jersey3' or other HTTP libraries instead.");
supportedLibraries.put(JERSEY2, "HTTP client: Jersey client 2.25.1. JSON processing: Jackson 2.9.x");
Expand Down Expand Up @@ -203,6 +220,13 @@ public JavaClientCodegen() {
// and the discriminator mapping schemas in the OAS document.
this.setLegacyDiscriminatorBehavior(false);

initMpRestClientVersionToRootPackage();
}

private void initMpRestClientVersionToRootPackage() {
mpRestClientVersions.put("1.4.1", new MpRestClientVersion("javax", "pom.mustache"));
mpRestClientVersions.put("2.0", new MpRestClientVersion("javax", "pom.mustache"));
mpRestClientVersions.put("3.0", new MpRestClientVersion("jakarta", "pom_3.0.mustache"));
}

@Override
Expand Down Expand Up @@ -280,6 +304,28 @@ public void processOpts() {
}
additionalProperties.put(MICROPROFILE_FRAMEWORK, microprofileFramework);

if (!additionalProperties.containsKey(MICROPROFILE_REST_CLIENT_VERSION)) {
additionalProperties.put(MICROPROFILE_REST_CLIENT_VERSION, MICROPROFILE_REST_CLIENT_DEFAULT_VERSION);
} else {
String mpRestClientVersion = (String) additionalProperties.get(MICROPROFILE_REST_CLIENT_VERSION);
if (!mpRestClientVersions.containsKey(mpRestClientVersion)){
throw new IllegalArgumentException(
String.format(Locale.ROOT,
"Version %s of MicroProfile Rest Client is not supported or incorrect. Supported versions are %s",
mpRestClientVersion,
String.join(", ", mpRestClientVersions.keySet())
)
);
}
}
if (!additionalProperties.containsKey("rootJavaEEPackage")) {
String mpRestClientVersion = (String) additionalProperties.get(MICROPROFILE_REST_CLIENT_VERSION);
if (mpRestClientVersions.containsKey(mpRestClientVersion)) {
rootJavaEEPackage = mpRestClientVersions.get(mpRestClientVersion).rootPackage;
}
additionalProperties.put("rootJavaEEPackage", rootJavaEEPackage);
}

if (additionalProperties.containsKey(CONFIG_KEY)) {
this.setConfigKey(additionalProperties.get(CONFIG_KEY).toString());
}
Expand Down Expand Up @@ -542,7 +588,9 @@ public void processOpts() {
} else if (MICROPROFILE.equals(getLibrary())) {
supportingFiles.clear(); // Don't need extra files provided by Java Codegen
String apiExceptionFolder = (sourceFolder + File.separator + apiPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar);
supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml"));
String mpRestClientVersion = (String) additionalProperties.get(MICROPROFILE_REST_CLIENT_VERSION);
String pomTemplate = mpRestClientVersions.get(mpRestClientVersion).pomTemplate;
supportingFiles.add(new SupportingFile(pomTemplate, "", "pom.xml"));
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md"));
supportingFiles.add(new SupportingFile("api_exception.mustache", apiExceptionFolder, "ApiException.java"));
supportingFiles.add(new SupportingFile("api_exception_mapper.mustache", apiExceptionFolder, "ApiExceptionMapper.java"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.ws.rs.*;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
import {{rootJavaEEPackage}}.ws.rs.*;
import {{rootJavaEEPackage}}.ws.rs.core.Response;
import {{rootJavaEEPackage}}.ws.rs.core.MediaType;
{{^disableMultipart}}
import org.apache.cxf.jaxrs.ext.multipart.*;
{{/disableMultipart}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{{>licenseInfo}}
package {{apiPackage}};

import javax.ws.rs.core.Response;
import {{rootJavaEEPackage}}.ws.rs.core.Response;

public class ApiException extends Exception {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{{>licenseInfo}}
package {{apiPackage}};

import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
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
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
@javax.annotation.Generated(value = "{{generatorClass}}"{{^hideGenerationTimestamp}}, date = "{{generatedDate}}"{{/hideGenerationTimestamp}})
@{{rootJavaEEPackage}}.annotation.Generated(value = "{{generatorClass}}"{{^hideGenerationTimestamp}}, date = "{{generatedDate}}"{{/hideGenerationTimestamp}})
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ package {{package}};
import java.io.Serializable;
{{/serializableModel}}
{{#useBeanValidation}}
import javax.validation.constraints.*;
import javax.validation.Valid;
import {{rootJavaEEPackage}}.validation.constraints.*;
import {{rootJavaEEPackage}}.validation.Valid;
{{/useBeanValidation}}

{{#models}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
{{#withXml}}
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;
import {{rootJavaEEPackage}}.xml.bind.annotation.XmlElement;
import {{rootJavaEEPackage}}.xml.bind.annotation.XmlRootElement;
import {{rootJavaEEPackage}}.xml.bind.annotation.XmlAccessType;
import {{rootJavaEEPackage}}.xml.bind.annotation.XmlAccessorType;
import {{rootJavaEEPackage}}.xml.bind.annotation.XmlType;
import {{rootJavaEEPackage}}.xml.bind.annotation.XmlEnum;
import {{rootJavaEEPackage}}.xml.bind.annotation.XmlEnumValue;
{{/withXml}}
{{^withXml}}
import java.lang.reflect.Type;
import javax.json.bind.annotation.JsonbTypeDeserializer;
import javax.json.bind.annotation.JsonbTypeSerializer;
import javax.json.bind.serializer.DeserializationContext;
import javax.json.bind.serializer.JsonbDeserializer;
import javax.json.bind.serializer.JsonbSerializer;
import javax.json.bind.serializer.SerializationContext;
import javax.json.stream.JsonGenerator;
import javax.json.stream.JsonParser;
import javax.json.bind.annotation.JsonbProperty;
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 javax.json.bind.annotation.JsonbCreator;
import {{rootJavaEEPackage}}.json.bind.annotation.JsonbCreator;
{{/vendorExtensions.x-has-readonly-properties}}
{{/withXml}}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<plugin>
<groupId>org.jboss.jandex</groupId>
<artifactId>jandex-maven-plugin</artifactId>
<version>1.1.0</version>
<version>${jandex.maven.plugin.version}</version>
<executions>
<execution>
<id>make-index</id>
Expand All @@ -26,7 +26,7 @@
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.6</version>
<version>${maven.failsafe.plugin.version}</version>
<executions>
<execution>
<goals>
Expand All @@ -39,7 +39,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.9.1</version>
<version>${build.helper.maven.plugin.version}</version>
<executions>
<execution>
<id>add-source</id>
Expand All @@ -61,99 +61,99 @@
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
{{#useBeanValidation}}
<!-- Bean Validation API support -->
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>${beanvalidation-version}</version>
<version>${beanvalidation.version}</version>
<scope>provided</scope>
</dependency>
{{/useBeanValidation}}
<!-- Eclipse MicroProfile Rest Client -->
<dependency>
<groupId>org.eclipse.microprofile.rest.client</groupId>
<artifactId>microprofile-rest-client-api</artifactId>
<version>1.4.1</version>
<version>${microprofile.rest.client.api.version}</version>
</dependency>

<!-- JAX-RS -->
<dependency>
<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>
<version>${jakarta.ws.rs-version}</version>
<version>${jakarta.ws.rs.version}</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>io.smallrye</groupId>
<artifactId>smallrye-rest-client</artifactId>
<version>1.2.1</version>
<version>${smallrye.rest.client.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>io.smallrye</groupId>
<artifactId>smallrye-config</artifactId>
<version>1.3.5</version>
<version>${smallrye.config.version}</version>
<scope>test</scope>
</dependency>
{{^disableMultipart}}
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.2.6</version>
<version>${cxf.rt.rs.extension.providers.version}</version>
</dependency>
{{/disableMultipart}}
<dependency>
<groupId>jakarta.json.bind</groupId>
<artifactId>jakarta.json.bind-api</artifactId>
<version>${jakarta.json.bind-version}</version>
<version>${jakarta.json.bind.version}</version>
</dependency>
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>${jakarta.json-version}</version>
<version>${jakarta.json.version}</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>${jakarta.xml.bind-version}</version>
<version>${jakarta.xml.bind.version}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
<version>${jaxb.core.version}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
<version>${jaxb.impl.version}</version>
</dependency>
<dependency>
<groupId>jakarta.activation</groupId>
<artifactId>jakarta.activation-api</artifactId>
<version>${jakarta.activation-version}</version>
<version>${jakarta.activation.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson-jaxrs-version}</version>
<version>${jackson.jaxrs.version}</version>
</dependency>
{{#useBeanValidationFeature}}
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.2.Final</version>
<version>${hibernate.validator.version}</version>
</dependency>
{{/useBeanValidationFeature}}
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>${jakarta-annotation-version}</version>
<version>${jakarta.annotation.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
Expand All @@ -170,21 +170,31 @@
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<swagger-core-version>1.5.18</swagger-core-version>
<jetty-version>9.2.9.v20150224</jetty-version>
<junit-version>4.13.2</junit-version>
<logback-version>1.2.10</logback-version>
<swagger.core.version>1.5.18</swagger.core.version>
<jetty.version>9.2.9.v20150224</jetty.version>
<junit.version>4.13.2</junit.version>
<logback.version>1.2.10</logback.version>
{{#useBeanValidation}}
<beanvalidation-version>2.0.2</beanvalidation-version>
<beanvalidation.version>2.0.2</beanvalidation.version>
{{/useBeanValidation}}
<cxf-version>3.2.7</cxf-version>
<jackson-jaxrs-version>2.9.7</jackson-jaxrs-version>
<jakarta.activation-version>1.2.2</jakarta.activation-version>
<jakarta-annotation-version>1.3.5</jakarta-annotation-version>
<jakarta.json.bind-version>1.0.2</jakarta.json.bind-version>
<jakarta.json-version>1.1.6</jakarta.json-version>
<jakarta.ws.rs-version>2.1.6</jakarta.ws.rs-version>
<jakarta.xml.bind-version>2.3.3</jakarta.xml.bind-version>
<cxf.version>3.2.7</cxf.version>
<jackson.jaxrs.version>2.9.7</jackson.jaxrs.version>
<jakarta.activation.version>1.2.2</jakarta.activation.version>
<jakarta.annotation.version>1.3.5</jakarta.annotation.version>
<jakarta.json.bind.version>1.0.2</jakarta.json.bind.version>
<jakarta.json.version>1.1.6</jakarta.json.version>
<jakarta.ws.rs.version>2.1.6</jakarta.ws.rs.version>
<jakarta.xml.bind.version>2.3.3</jakarta.xml.bind.version>
<microprofile.rest.client.api.version>{{microprofileRestClientVersion}}</microprofile.rest.client.api.version>
<smallrye.rest.client.version>1.2.1</smallrye.rest.client.version>
<smallrye.config.version>1.3.5</smallrye.config.version>
<cxf.rt.rs.extension.providers.version>3.2.6</cxf.rt.rs.extension.providers.version>
<jaxb.core.version>2.2.11</jaxb.core.version>
<jaxb.impl.version>2.2.11</jaxb.impl.version>
<hibernate.validator.version>5.2.2.Final</hibernate.validator.version>
<jandex.maven.plugin.version>1.1.0</jandex.maven.plugin.version>
<maven.failsafe.plugin.version>2.6</maven.failsafe.plugin.version>
<build.helper.maven.plugin.version>1.9.1</build.helper.maven.plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

0 comments on commit 0cb59fc

Please sign in to comment.