[Micronaut] Add support for OffsetDateTime for Micronaut generators (#11871)

* Fix test output folder error for MicronautServerGenerator

* Add java8 OffsetDateTime support for Micronaut Codegens
This commit is contained in:
Andriy Dmytruk 2022-03-15 12:05:55 -04:00 committed by GitHub
parent a44c7e0753
commit 47f07158a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 94 additions and 46 deletions

View File

@ -30,6 +30,9 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|booleanGetterPrefix|Set booleanGetterPrefix| |get|
|build|Specify for which build tool to generate files|<dl><dt>**gradle**</dt><dd>Gradle configuration is generated for the project</dd><dt>**all**</dt><dd>Both Gradle and Maven configurations are generated</dd><dt>**maven**</dt><dd>Maven configuration is generated for the project</dd></dl>|all|
|configureAuth|Configure all the authorization methods as specified in the file| |false|
|dateFormat|Specify the format pattern of date as a string| |null|
|dateLibrary|Option. Date library to use|<dl><dt>**java8-localdatetime**</dt><dd>Java 8 using LocalDateTime (for legacy app only)</dd><dt>**java8**</dt><dd>Java 8 native JSR310 (preferred for jdk 1.8+)</dd></dl>|java8|
|datetimeFormat|Specify the format pattern of date-time as a string| |null|
|developerEmail|developer email in generated pom.xml| |team@openapitools.org|
|developerName|developer name in generated pom.xml| |OpenAPI-Generator Contributors|
|developerOrganization|developer organization in generated pom.xml| |OpenAPITools.org|

View File

@ -29,6 +29,9 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|booleanGetterPrefix|Set booleanGetterPrefix| |get|
|build|Specify for which build tool to generate files|<dl><dt>**gradle**</dt><dd>Gradle configuration is generated for the project</dd><dt>**all**</dt><dd>Both Gradle and Maven configurations are generated</dd><dt>**maven**</dt><dd>Maven configuration is generated for the project</dd></dl>|all|
|controllerPackage|The package in which controllers will be generated| |org.openapitools.api|
|dateFormat|Specify the format pattern of date as a string| |null|
|dateLibrary|Option. Date library to use|<dl><dt>**java8-localdatetime**</dt><dd>Java 8 using LocalDateTime (for legacy app only)</dd><dt>**java8**</dt><dd>Java 8 native JSR310 (preferred for jdk 1.8+)</dd></dl>|java8|
|datetimeFormat|Specify the format pattern of date-time as a string| |null|
|developerEmail|developer email in generated pom.xml| |team@openapitools.org|
|developerName|developer name in generated pom.xml| |OpenAPI-Generator Contributors|
|developerOrganization|developer organization in generated pom.xml| |OpenAPITools.org|

View File

@ -23,6 +23,10 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
public static final String OPT_REQUIRED_PROPERTIES_IN_CONSTRUCTOR = "requiredPropertiesInConstructor";
public static final String OPT_MICRONAUT_VERSION = "micronautVersion";
public static final String OPT_USE_AUTH = "useAuth";
public static final String OPT_DATE_LIBRARY_JAVA8 = "java8";
public static final String OPT_DATE_LIBRARY_JAVA8_LOCAL_DATETIME = "java8-localdatetime";
public static final String OPT_DATE_FORMAT = "dateFormat";
public static final String OPT_DATETIME_FORMAT = "datetimeFormat";
protected String title;
protected boolean useBeanValidation;
@ -35,6 +39,9 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
public static final String CONTENT_TYPE_APPLICATION_JSON = "application/json";
public static final String CONTENT_TYPE_MULTIPART_FORM_DATA = "multipart/form-data";
public static final String CONTENT_TYPE_ANY = "*/*";
public static final String DATE_FORMAT = "yyyy-MM-dd";
public static final String DATETIME_FORMAT = DATE_FORMAT + "'T'HH:mm:ss.SSS";
public static final String OFFSET_DATETIME_FORMAT = DATETIME_FORMAT + "XXXX";
public JavaMicronautAbstractCodegen() {
super();
@ -52,6 +59,7 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
embeddedTemplateDir = templateDir = "java-micronaut";
apiDocPath = "docs/apis";
modelDocPath = "docs/models";
dateLibrary = OPT_DATE_LIBRARY_JAVA8;
// Set implemented features for user information
modifyFeatureSet(features -> features
@ -100,9 +108,16 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
testToolOption.setEnum(testToolOptionMap);
cliOptions.add(testToolOption);
// Remove the date library option
cliOptions.stream().filter(o -> o.getOpt().equals("dateLibrary")).findFirst()
.ifPresent(v -> cliOptions.remove(v));
cliOptions.add(new CliOption(OPT_DATE_FORMAT, "Specify the format pattern of date as a string"));
cliOptions.add(new CliOption(OPT_DATETIME_FORMAT, "Specify the format pattern of date-time as a string"));
// Modify the DATE_LIBRARY option to only have supported values
cliOptions.stream().filter(o -> o.getOpt().equals(DATE_LIBRARY)).findFirst().ifPresent(opt -> {
Map<String, String> valuesEnum = new HashMap<>();
valuesEnum.put(OPT_DATE_LIBRARY_JAVA8, opt.getEnum().get(OPT_DATE_LIBRARY_JAVA8));
valuesEnum.put(OPT_DATE_LIBRARY_JAVA8_LOCAL_DATETIME, opt.getEnum().get(OPT_DATE_LIBRARY_JAVA8_LOCAL_DATETIME));
opt.setEnum(valuesEnum);
});
// Add reserved words
String[] reservedWordsArray = {
@ -209,11 +224,20 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
// Git files
supportingFiles.add(new SupportingFile("common/configuration/git/gitignore.mustache", "", ".gitignore").doNotOverwrite());
// Use the default java LocalDate
typeMapping.put("date", "LocalDate");
typeMapping.put("DateTime", "LocalDateTime");
importMapping.put("LocalDate", "java.time.LocalDate");
importMapping.put("LocalDateTime", "java.time.LocalDateTime");
// Use the default java time
additionalProperties.putIfAbsent(OPT_DATE_FORMAT, DATE_FORMAT);
if (dateLibrary.equals(OPT_DATE_LIBRARY_JAVA8)) {
typeMapping.put("DateTime", "OffsetDateTime");
typeMapping.put("date", "LocalDate");
additionalProperties.putIfAbsent(OPT_DATETIME_FORMAT, OFFSET_DATETIME_FORMAT);
} else if (dateLibrary.equals(OPT_DATE_LIBRARY_JAVA8_LOCAL_DATETIME)) {
typeMapping.put("DateTime", "LocalDateTime");
typeMapping.put("date", "LocalDate");
additionalProperties.putIfAbsent(OPT_DATETIME_FORMAT, DATETIME_FORMAT);
}
importMapping.putIfAbsent("LocalDateTime", "java.time.LocalDateTime");
importMapping.putIfAbsent("OffsetDateTime", "java.time.OffsetDateTime");
importMapping.putIfAbsent("LocalDate", "java.time.LocalDate");
// Add documentation files
modelDocTemplateFiles.clear();
@ -431,6 +455,8 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i
example = example != null ? example : "false";
} else if ("File".equals(dataType)) {
example = null;
} else if ("OffsetDateTime".equals(dataType)) {
example = "OffsetDateTime.of(2001, 2, 3, 12, 0, 0, 0, java.time.ZoneOffset.of(\"+02:00\"))";
} else if ("LocalDate".equals(dataType)) {
example = "LocalDate.of(2001, 2, 3)";
} else if ("LocalDateTime".equals(dataType)) {

View File

@ -29,6 +29,7 @@ public class JavaMicronautServerCodegen extends JavaMicronautAbstractCodegen {
protected String controllerSuffix = "Controller";
protected String apiPrefix = "Abstract";
protected String apiSuffix = "Controller";
private String testOutputDir;
public JavaMicronautServerCodegen() {
super();
@ -140,18 +141,27 @@ public class JavaMicronautServerCodegen extends JavaMicronautAbstractCodegen {
supportingFiles.add(new SupportingFile("common/configuration/Application.mustache", invokerFolder, "Application.java").doNotOverwrite());
}
@Override
public String apiTestFileFolder() {
return super.getOutputDir();
}
@Override
public String apiTestFilename(String templateName, String tag) {
// For controller implementation
if (generateControllerAsAbstract && templateName.contains("controllerImplementation")) {
return (
outputFolder + File.separator +
String implementationFolder = outputFolder + File.separator +
sourceFolder + File.separator +
controllerPackage.replace('.', File.separatorChar) + File.separator +
controllerPackage.replace('.', File.separatorChar);
testOutputDir = implementationFolder;
return (implementationFolder + File.separator +
StringUtils.camelize(controllerPrefix + "_" + tag + "_" + controllerSuffix) + ".java"
).replace('/', File.separatorChar);
}
return super.apiTestFilename(templateName, tag);
// For api tests
String suffix = apiTestTemplateFiles().get(templateName);
return super.apiTestFileFolder() + File.separator + toApiTestFilename(tag) + suffix;
}
@Override

View File

@ -1 +1,7 @@
{{!normal type}}{{^isDate}}{{^isDateTime}}{{{dataType}}}{{/isDateTime}}{{/isDate}}{{!date-time}}{{#isDateTime}}@Format("yyyy-MM-dd'T'HH:mm:ss.SSSXXXX") {{{dataType}}}{{/isDateTime}}{{!date}}{{#isDate}}@Format("yyyy-MM-dd") {{{dataType}}}{{/isDate}}
{{!
default type
}}{{^isDate}}{{^isDateTime}}{{{dataType}}}{{/isDateTime}}{{/isDate}}{{!
date-time
}}{{#isDateTime}}@Format("{{{datetimeFormat}}}") {{{dataType}}}{{/isDateTime}}{{!
date
}}{{#isDate}}@Format("{{{dateFormat}}}") {{{dataType}}}{{/isDate}}

View File

@ -19,8 +19,8 @@
{{/isContainer}}
{{/withXml}}
{{#isDateTime}}
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXX")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "{{{datetimeFormat}}}")
{{/isDateTime}}
{{#isDate}}
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "{{{dateFormat}}}")
{{/isDate}}

View File

@ -2,6 +2,6 @@
default type
}}{{^isDate}}{{^isDateTime}}{{{dataType}}}{{/isDateTime}}{{/isDate}}{{!
date-time
}}{{#isDateTime}}@Format("yyyy-MM-dd'T'HH:mm:ss.SSSXXXX") {{{dataType}}}{{/isDateTime}}{{!
}}{{#isDateTime}}@Format("{{{datetimeFormat}}}") {{{dataType}}}{{/isDateTime}}{{!
date
}}{{#isDate}}@Format("yyyy-MM-dd") {{{dataType}}}{{/isDate}}
}}{{#isDate}}@Format("{{{dateFormat}}}") {{{dataType}}}{{/isDate}}

View File

@ -268,7 +268,7 @@ Name | Type | Description | Notes
**string** | `String`| None | [optional parameter]
**binary** | `File`| None | [optional parameter]
**date** | `LocalDate`| None | [optional parameter]
**dateTime** | `LocalDateTime`| None | [optional parameter]
**dateTime** | `OffsetDateTime`| None | [optional parameter]
**password** | `String`| None | [optional parameter]
**paramCallback** | `String`| None | [optional parameter]

View File

@ -18,7 +18,7 @@ Name | Type | Description | Notes
**_byte** | `byte[]` | |
**binary** | `File` | | [optional property]
**date** | `LocalDate` | |
**dateTime** | `LocalDateTime` | | [optional property]
**dateTime** | `OffsetDateTime` | | [optional property]
**uuid** | `UUID` | | [optional property]
**password** | `String` | |
**bigDecimal** | `BigDecimal` | | [optional property]

View File

@ -9,7 +9,7 @@ The class is defined in **[MixedPropertiesAndAdditionalPropertiesClass.java](../
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**uuid** | `UUID` | | [optional property]
**dateTime** | `LocalDateTime` | | [optional property]
**dateTime** | `OffsetDateTime` | | [optional property]
**map** | [`Map&lt;String, Animal&gt;`](Animal.md) | | [optional property]

View File

@ -11,7 +11,7 @@ Name | Type | Description | Notes
**id** | `Long` | | [optional property]
**petId** | `Long` | | [optional property]
**quantity** | `Integer` | | [optional property]
**shipDate** | `LocalDateTime` | | [optional property]
**shipDate** | `OffsetDateTime` | | [optional property]
**status** | [**StatusEnum**](#StatusEnum) | Order Status | [optional property]
**complete** | `Boolean` | | [optional property]

View File

@ -21,8 +21,8 @@ import java.math.BigDecimal;
import java.io.File;
import org.openapitools.model.FileSchemaTestClass;
import java.time.LocalDate;
import java.time.LocalDateTime;
import org.openapitools.model.ModelClient;
import java.time.OffsetDateTime;
import org.openapitools.model.OuterComposite;
import org.openapitools.model.User;
import org.openapitools.model.XmlItem;
@ -169,7 +169,7 @@ public interface FakeApi {
@Nullable @Pattern(regexp="/[a-z]/i") String string,
@Nullable File binary,
@Nullable @Format("yyyy-MM-dd") LocalDate date,
@Nullable @Format("yyyy-MM-dd'T'HH:mm:ss.SSSXXXX") LocalDateTime dateTime,
@Nullable @Format("yyyy-MM-dd'T'HH:mm:ss.SSSXXXX") OffsetDateTime dateTime,
@Nullable @Size(min=10, max=64) String password,
@Nullable String paramCallback
);

View File

@ -17,7 +17,7 @@ import io.micronaut.core.annotation.*;
import io.micronaut.http.client.annotation.Client;
import io.micronaut.core.convert.format.Format;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import org.openapitools.model.User;
import javax.annotation.Generated;
import java.util.ArrayList;

View File

@ -20,7 +20,7 @@ import io.swagger.annotations.ApiModelProperty;
import java.io.File;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.util.UUID;
import com.fasterxml.jackson.annotation.*;
@ -83,7 +83,7 @@ public class FormatTest {
private LocalDate date;
public static final String JSON_PROPERTY_DATE_TIME = "dateTime";
private LocalDateTime dateTime;
private OffsetDateTime dateTime;
public static final String JSON_PROPERTY_UUID = "uuid";
private UUID uuid;
@ -349,7 +349,7 @@ public class FormatTest {
this.date = date;
}
public FormatTest dateTime(LocalDateTime dateTime) {
public FormatTest dateTime(OffsetDateTime dateTime) {
this.dateTime = dateTime;
return this;
}
@ -363,14 +363,14 @@ public class FormatTest {
@JsonProperty(JSON_PROPERTY_DATE_TIME)
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXX")
public LocalDateTime getDateTime() {
public OffsetDateTime getDateTime() {
return dateTime;
}
@JsonProperty(JSON_PROPERTY_DATE_TIME)
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXX")
public void setDateTime(LocalDateTime dateTime) {
public void setDateTime(OffsetDateTime dateTime) {
this.dateTime = dateTime;
}

View File

@ -16,7 +16,7 @@ import java.util.Objects;
import java.util.Arrays;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -45,7 +45,7 @@ public class MixedPropertiesAndAdditionalPropertiesClass {
private UUID uuid;
public static final String JSON_PROPERTY_DATE_TIME = "dateTime";
private LocalDateTime dateTime;
private OffsetDateTime dateTime;
public static final String JSON_PROPERTY_MAP = "map";
private Map<String, Animal> map = null;
@ -75,7 +75,7 @@ public class MixedPropertiesAndAdditionalPropertiesClass {
this.uuid = uuid;
}
public MixedPropertiesAndAdditionalPropertiesClass dateTime(LocalDateTime dateTime) {
public MixedPropertiesAndAdditionalPropertiesClass dateTime(OffsetDateTime dateTime) {
this.dateTime = dateTime;
return this;
}
@ -89,14 +89,14 @@ public class MixedPropertiesAndAdditionalPropertiesClass {
@JsonProperty(JSON_PROPERTY_DATE_TIME)
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXX")
public LocalDateTime getDateTime() {
public OffsetDateTime getDateTime() {
return dateTime;
}
@JsonProperty(JSON_PROPERTY_DATE_TIME)
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXX")
public void setDateTime(LocalDateTime dateTime) {
public void setDateTime(OffsetDateTime dateTime) {
this.dateTime = dateTime;
}

View File

@ -16,7 +16,7 @@ import java.util.Objects;
import java.util.Arrays;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import com.fasterxml.jackson.annotation.*;
import javax.validation.constraints.*;
@ -49,7 +49,7 @@ public class Order {
private Integer quantity;
public static final String JSON_PROPERTY_SHIP_DATE = "shipDate";
private LocalDateTime shipDate;
private OffsetDateTime shipDate;
/**
* Order Status
@ -162,7 +162,7 @@ public class Order {
this.quantity = quantity;
}
public Order shipDate(LocalDateTime shipDate) {
public Order shipDate(OffsetDateTime shipDate) {
this.shipDate = shipDate;
return this;
}
@ -176,14 +176,14 @@ public class Order {
@JsonProperty(JSON_PROPERTY_SHIP_DATE)
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXX")
public LocalDateTime getShipDate() {
public OffsetDateTime getShipDate() {
return shipDate;
}
@JsonProperty(JSON_PROPERTY_SHIP_DATE)
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXX")
public void setShipDate(LocalDateTime shipDate) {
public void setShipDate(OffsetDateTime shipDate) {
this.shipDate = shipDate;
}

View File

@ -13,7 +13,7 @@ Name | Type | Description | Notes
**id** | `Long` | | [optional property]
**petId** | `Long` | | [optional property]
**quantity** | `Integer` | | [optional property]
**shipDate** | `LocalDateTime` | | [optional property]
**shipDate** | `OffsetDateTime` | | [optional property]
**status** | [**StatusEnum**](#StatusEnum) | Order Status | [optional property]
**complete** | `Boolean` | | [optional property]

View File

@ -16,7 +16,7 @@ import io.micronaut.http.annotation.*;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.core.convert.format.Format;
import reactor.core.publisher.Mono;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import org.openapitools.model.User;
import javax.annotation.Generated;
import java.util.ArrayList;

View File

@ -16,7 +16,7 @@ import java.util.Objects;
import java.util.Arrays;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import com.fasterxml.jackson.annotation.*;
import javax.validation.constraints.*;
@ -50,7 +50,7 @@ public class Order {
private Integer quantity;
public static final String JSON_PROPERTY_SHIP_DATE = "shipDate";
private LocalDateTime shipDate;
private OffsetDateTime shipDate;
/**
* Order Status
@ -164,7 +164,7 @@ public class Order {
this.quantity = quantity;
}
public Order shipDate(LocalDateTime shipDate) {
public Order shipDate(OffsetDateTime shipDate) {
this.shipDate = shipDate;
return this;
}
@ -178,14 +178,14 @@ public class Order {
@JsonProperty(JSON_PROPERTY_SHIP_DATE)
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXX")
public LocalDateTime getShipDate() {
public OffsetDateTime getShipDate() {
return shipDate;
}
@JsonProperty(JSON_PROPERTY_SHIP_DATE)
@JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXX")
public void setShipDate(LocalDateTime shipDate) {
public void setShipDate(OffsetDateTime shipDate) {
this.shipDate = shipDate;
}