Skip to content

Commit 2b868b8

Browse files
authored
Merge pull request #791 from altro3/support_enum_annotations
2 parents 03c10d6 + be8e238 commit 2b868b8

16 files changed

+932
-171
lines changed

config/checkstyle/checkstyle.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@
5858

5959
<!-- Checks for Size Violations. -->
6060
<!-- See https://checkstyle.org/config_sizes.html -->
61-
<module name="FileLength"/>
61+
<module name="FileLength">
62+
<property name="max" value="3000"/>
63+
</module>
6264

6365
<!-- Checks for whitespace -->
6466
<!-- See https://checkstyle.org/config_whitespace.html -->

gradle.properties

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
projectVersion=4.4.4-SNAPSHOT
1+
projectVersion=4.5.0-SNAPSHOT
22
projectGroup=io.micronaut.openapi
33

44
micronautDocsVersion=2.0.0
5-
micronautVersion=3.5.3
6-
micronautTestVersion=3.4.0
7-
groovyVersion=3.0.11
5+
micronautVersion=3.6.1
6+
micronautTestVersion=3.5.0
7+
groovyVersion=3.0.12
88
spockVersion=2.1-groovy-3.0
99

1010
title=OpenAPI/Swagger Support
1111
projectDesc=Configuration to integrate Micronaut and OpenAPI/Swagger
1212
projectUrl=https://micronaut.io
1313
githubSlug=micronaut-projects/micronaut-openapi
14-
developers=Puneet Behl,Álvaro Sánchez-Mariscal,Iván López
14+
developers=Puneet Behl,Álvaro Sánchez-Mariscal,Iván López
1515

1616
githubCoreBranch=3.6.x
1717

openapi/src/main/java/io/micronaut/openapi/visitor/AbstractOpenApiEndpointVisitor.java

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -485,10 +485,26 @@ private void processParameterAnnotationInMethod(MethodElement element,
485485
paramAnn.stringValue("name").ifPresent(parameter::name);
486486
paramAnn.enumValue("in", ParameterIn.class).ifPresent(in -> parameter.in(in.toString()));
487487
paramAnn.stringValue("description").ifPresent(parameter::description);
488-
paramAnn.booleanValue("required").ifPresent(parameter::required);
489-
paramAnn.booleanValue("deprecated").ifPresent(parameter::deprecated);
490-
paramAnn.booleanValue("allowEmptyValue").ifPresent(parameter::allowEmptyValue);
491-
paramAnn.booleanValue("allowReserved").ifPresent(parameter::allowReserved);
488+
paramAnn.booleanValue("required").ifPresent(value -> {
489+
if (value) {
490+
parameter.setRequired(true);
491+
}
492+
});
493+
paramAnn.booleanValue("deprecated").ifPresent(value -> {
494+
if (value) {
495+
parameter.setDeprecated(true);
496+
}
497+
});
498+
paramAnn.booleanValue("allowEmptyValue").ifPresent(value -> {
499+
if (value) {
500+
parameter.setAllowEmptyValue(true);
501+
}
502+
});
503+
paramAnn.booleanValue("allowReserved").ifPresent(value -> {
504+
if (value) {
505+
parameter.setAllowReserved(true);
506+
}
507+
});
492508
paramAnn.stringValue("example").ifPresent(parameter::example);
493509
paramAnn.stringValue("ref").ifPresent(parameter::$ref);
494510
paramAnn.enumValue("style", ParameterStyle.class).ifPresent(style -> parameter.setStyle(paramStyle(style)));
@@ -585,8 +601,8 @@ private void processParameter(VisitorContext context, OpenAPI openAPI,
585601
newParameter.setName(parameter.getName());
586602
}
587603

588-
if (newParameter.getRequired() == null) {
589-
newParameter.setRequired(!parameter.isNullable() && !parameter.getType().isOptional());
604+
if (newParameter.getRequired() == null && !parameter.isNullable() && !parameter.getType().isOptional()) {
605+
newParameter.setRequired(true);
590606
}
591607
if (javadocDescription != null && StringUtils.isEmpty(newParameter.getDescription())) {
592608
CharSequence desc = javadocDescription.getParameters().get(parameter.getName());
@@ -598,7 +614,7 @@ private void processParameter(VisitorContext context, OpenAPI openAPI,
598614

599615
Schema schema = newParameter.getSchema();
600616
if (schema == null) {
601-
schema = resolveSchema(openAPI, parameter, parameterType, context, consumesMediaTypes, null);
617+
schema = resolveSchema(openAPI, parameter, parameterType, context, consumesMediaTypes, null, null);
602618
}
603619

604620
if (schema != null) {
@@ -610,14 +626,11 @@ private void processParameter(VisitorContext context, OpenAPI openAPI,
610626
private void processBodyParameter(VisitorContext context, OpenAPI openAPI, JavadocDescription javadocDescription,
611627
MediaType mediaType, Schema schema, TypedElement parameter) {
612628
Schema propertySchema = resolveSchema(openAPI, parameter, parameter.getType(), context,
613-
Collections.singletonList(mediaType), null);
629+
Collections.singletonList(mediaType), null, null);
614630
if (propertySchema != null) {
615631

616-
Optional<String> description = parameter.getValue(io.swagger.v3.oas.annotations.Parameter.class,
617-
"description", String.class);
618-
if (description.isPresent()) {
619-
propertySchema.setDescription(description.get());
620-
}
632+
Optional<String> description = parameter.getValue(io.swagger.v3.oas.annotations.Parameter.class, "description", String.class);
633+
description.ifPresent(propertySchema::setDescription);
621634
processSchemaProperty(context, parameter, parameter.getType(), null, schema, propertySchema);
622635
if (parameter.isNullable() || parameter.getType().isOptional()) {
623636
// Keep null if not
@@ -820,7 +833,7 @@ private void processBody(VisitorContext context, OpenAPI openAPI,
820833
if (existedMediaType.getExamples() == null) {
821834
existedMediaType.setExamples(mediaType.getExamples());
822835
}
823-
if (existedMediaType.getExample() == null) {
836+
if (existedMediaType.getExample() == null && mediaType.getExampleSetFlag()) {
824837
existedMediaType.setExample(mediaType.getExample());
825838
}
826839
}
@@ -980,10 +993,18 @@ private io.swagger.v3.oas.models.Operation readOperation(MethodElement element,
980993
}
981994
swaggerParam.setName(paramAnn.name());
982995
swaggerParam.setDescription(paramAnn.description());
983-
swaggerParam.setRequired(paramAnn.required());
984-
swaggerParam.setDeprecated(paramAnn.deprecated());
985-
swaggerParam.setAllowEmptyValue(paramAnn.allowEmptyValue());
986-
swaggerParam.setAllowReserved(paramAnn.allowReserved());
996+
if (paramAnn.required()) {
997+
swaggerParam.setRequired(true);
998+
}
999+
if (paramAnn.deprecated()) {
1000+
swaggerParam.setDeprecated(true);
1001+
}
1002+
if (paramAnn.allowEmptyValue()) {
1003+
swaggerParam.setAllowEmptyValue(true);
1004+
}
1005+
if (paramAnn.allowReserved()) {
1006+
swaggerParam.setAllowReserved(true);
1007+
}
9871008
swaggerParam.setExample(paramAnn.example());
9881009
swaggerParam.setStyle(paramStyle(paramAnn.style()));
9891010
swaggerParam.$ref(paramAnn.ref());
@@ -1321,7 +1342,8 @@ private void addTagIfNotPresent(String tag, io.swagger.v3.oas.models.Operation s
13211342
private void readTags(MethodElement element, VisitorContext context, io.swagger.v3.oas.models.Operation swaggerOperation, List<io.swagger.v3.oas.models.tags.Tag> classTags, OpenAPI openAPI) {
13221343
element.getAnnotationValuesByType(Tag.class).forEach(av -> av.get("name", String.class).ifPresent(swaggerOperation::addTagsItem));
13231344

1324-
List<io.swagger.v3.oas.models.tags.Tag> operationTags = processOpenApiAnnotation(element, context, Tag.class, io.swagger.v3.oas.models.tags.Tag.class, openAPI.getTags());
1345+
List<io.swagger.v3.oas.models.tags.Tag> copyTags = openAPI.getTags() != null ? new ArrayList<>(openAPI.getTags()) : null;
1346+
List<io.swagger.v3.oas.models.tags.Tag> operationTags = processOpenApiAnnotation(element, context, Tag.class, io.swagger.v3.oas.models.tags.Tag.class, copyTags);
13251347
// find not simple tags (tags with description or other information), such fields need to be described at the openAPI level.
13261348
List<io.swagger.v3.oas.models.tags.Tag> complexTags = null;
13271349
if (CollectionUtils.isNotEmpty(operationTags)) {
@@ -1338,17 +1360,17 @@ private void readTags(MethodElement element, VisitorContext context, io.swagger.
13381360
if (CollectionUtils.isEmpty(openAPI.getTags())) {
13391361
openAPI.setTags(complexTags);
13401362
} else {
1341-
for (io.swagger.v3.oas.models.tags.Tag operationTag : complexTags) {
1363+
for (io.swagger.v3.oas.models.tags.Tag complexTag : complexTags) {
13421364
// skip all existed tags
13431365
boolean alreadyExists = false;
13441366
for (io.swagger.v3.oas.models.tags.Tag apiTag : openAPI.getTags()) {
1345-
if (apiTag.getName().equals(operationTag.getName())) {
1367+
if (apiTag.getName().equals(complexTag.getName())) {
13461368
alreadyExists = true;
13471369
break;
13481370
}
13491371
}
13501372
if (!alreadyExists) {
1351-
openAPI.getTags().add(operationTag);
1373+
openAPI.getTags().add(complexTag);
13521374
}
13531375
}
13541376
}
@@ -1367,14 +1389,16 @@ private List<io.swagger.v3.oas.models.tags.Tag> readTags(ClassElement element, V
13671389
final List<io.swagger.v3.oas.models.tags.Tag> readTags(List<AnnotationValue<Tag>> annotations, VisitorContext context) {
13681390
return annotations.stream()
13691391
.map(av -> toValue(av.getValues(), context, io.swagger.v3.oas.models.tags.Tag.class))
1370-
.filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());
1392+
.filter(Optional::isPresent)
1393+
.map(Optional::get)
1394+
.collect(Collectors.toList());
13711395
}
13721396

13731397
private Content buildContent(Element definingElement, ClassElement type, List<MediaType> mediaTypes, OpenAPI openAPI, VisitorContext context) {
13741398
Content content = new Content();
13751399
mediaTypes.forEach(mediaType -> {
13761400
io.swagger.v3.oas.models.media.MediaType mt = new io.swagger.v3.oas.models.media.MediaType();
1377-
mt.setSchema(resolveSchema(openAPI, definingElement, type, context, Collections.singletonList(mediaType), null));
1401+
mt.setSchema(resolveSchema(openAPI, definingElement, type, context, Collections.singletonList(mediaType), null, null));
13781402
content.addMediaType(mediaType.toString(), mt);
13791403
});
13801404
return content;

0 commit comments

Comments
 (0)