From fb62b45b21f02478817699bc00dd6cfa3d89350b Mon Sep 17 00:00:00 2001 From: Tijs-2 <61583532+Tijs-2@users.noreply.github.com> Date: Fri, 15 May 2020 14:15:30 +0200 Subject: [PATCH] Added the @Tag and @Tags functionality. You can now add a one or multiple tags to a controller or to the method itself. They will be added instead of overwritten. --- .../javalin/generator/MethodReader.java | 23 +++++++++++++++ .../dinject/javalin/generator/Processor.java | 16 +++++++++- .../javalin/generator/openapi/DocContext.java | 29 +++++++++++++++++++ .../generator/openapi/MethodDocBuilder.java | 1 + 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/dinject/javalin/generator/MethodReader.java b/src/main/java/io/dinject/javalin/generator/MethodReader.java index 494ddde28..51837641d 100644 --- a/src/main/java/io/dinject/javalin/generator/MethodReader.java +++ b/src/main/java/io/dinject/javalin/generator/MethodReader.java @@ -10,7 +10,10 @@ import io.dinject.controller.Put; import io.dinject.javalin.generator.javadoc.Javadoc; import io.dinject.javalin.generator.openapi.MethodDocBuilder; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.tags.Tags; +import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.ExecutableType; @@ -91,6 +94,26 @@ public A findAnnotation(Class type) { return bean.findMethodAnnotation(type, element); } + private List addTagsToList(Element element, List list){ + if(element == null) + return list; + + if (element.getAnnotation(Tag.class) != null) { + list.add(element.getAnnotation(Tag.class).name()); + } + if (element.getAnnotation(Tags.class) != null) { + for(Tag tag: element.getAnnotation(Tags.class).value()) + list.add(tag.name()); + } + return list; + } + + public List getTags(){ + List tags = new ArrayList<>(); + tags = addTagsToList(element, tags); + return addTagsToList(element.getEnclosingElement(), tags); + } + void read() { if (!methodRoles.isEmpty()) { bean.addStaticImportType(ctx.isJavalin3() ? JAVALIN3_ROLES : JAVALIN2_ROLES); diff --git a/src/main/java/io/dinject/javalin/generator/Processor.java b/src/main/java/io/dinject/javalin/generator/Processor.java index 441027a77..a63a60d92 100644 --- a/src/main/java/io/dinject/javalin/generator/Processor.java +++ b/src/main/java/io/dinject/javalin/generator/Processor.java @@ -2,6 +2,8 @@ import io.dinject.controller.Controller; import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.tags.Tags; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.ProcessingEnvironment; @@ -41,6 +43,7 @@ public boolean process(Set annotations, RoundEnvironment if (ctx.isOpenApiAvailable()) { readOpenApiDefinition(round); + readTagDefinitions(round); } Set controllers = round.getElementsAnnotatedWith(Controller.class); @@ -55,13 +58,24 @@ public boolean process(Set annotations, RoundEnvironment } private void readOpenApiDefinition(RoundEnvironment round) { - Set elements = round.getElementsAnnotatedWith(OpenAPIDefinition.class); for (Element element : elements) { ctx.doc().readApiDefinition(element); } } + private void readTagDefinitions(RoundEnvironment round) { + Set elements = round.getElementsAnnotatedWith(Tag.class); + for (Element element : elements) { + ctx.doc().addTagDefinition(element); + } + + elements = round.getElementsAnnotatedWith(Tags.class); + for (Element element : elements) { + ctx.doc().addTagsDefinition(element); + } + } + private void writeOpenAPI() { ctx.doc().writeApi(); } diff --git a/src/main/java/io/dinject/javalin/generator/openapi/DocContext.java b/src/main/java/io/dinject/javalin/generator/openapi/DocContext.java index 35b570287..be3560a09 100644 --- a/src/main/java/io/dinject/javalin/generator/openapi/DocContext.java +++ b/src/main/java/io/dinject/javalin/generator/openapi/DocContext.java @@ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.tags.Tags; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; @@ -131,6 +133,33 @@ private Components components() { return components; } + private io.swagger.v3.oas.models.tags.Tag createTagItem(Tag tag){ + io.swagger.v3.oas.models.tags.Tag tagsItem = new io.swagger.v3.oas.models.tags.Tag(); + tagsItem.setName(tag.name()); + tagsItem.setDescription(tag.description()); + // tagsItem.setExtensions(tag.extensions()); # Not sure about the extensions + // tagsItem.setExternalDocs(tag.externalDocs()); # Not sure about the external docs + return tagsItem; + } + + public void addTagsDefinition(Element element) { + Tags tags = element.getAnnotation(Tags.class); + if(tags == null) + return; + + for(Tag tag: tags.value()){ + openAPI.addTagsItem(createTagItem(tag)); + } + } + + public void addTagDefinition(Element element){ + Tag tag = element.getAnnotation(Tag.class); + if(tag == null) + return; + + openAPI.addTagsItem(createTagItem(tag)); + } + public void readApiDefinition(Element element) { OpenAPIDefinition openApi = element.getAnnotation(OpenAPIDefinition.class); diff --git a/src/main/java/io/dinject/javalin/generator/openapi/MethodDocBuilder.java b/src/main/java/io/dinject/javalin/generator/openapi/MethodDocBuilder.java index bd613c65d..ff0a5c5bd 100644 --- a/src/main/java/io/dinject/javalin/generator/openapi/MethodDocBuilder.java +++ b/src/main/java/io/dinject/javalin/generator/openapi/MethodDocBuilder.java @@ -36,6 +36,7 @@ public void build() { //operation.setOperationId(); operation.setSummary(javadoc.getSummary()); operation.setDescription(javadoc.getDescription()); + operation.setTags(methodReader.getTags()); if (javadoc.isDeprecated()) { operation.setDeprecated(true);