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 extends TypeElement> annotations, RoundEnvironment
if (ctx.isOpenApiAvailable()) {
readOpenApiDefinition(round);
+ readTagDefinitions(round);
}
Set extends Element> controllers = round.getElementsAnnotatedWith(Controller.class);
@@ -55,13 +58,24 @@ public boolean process(Set extends TypeElement> annotations, RoundEnvironment
}
private void readOpenApiDefinition(RoundEnvironment round) {
-
Set extends Element> elements = round.getElementsAnnotatedWith(OpenAPIDefinition.class);
for (Element element : elements) {
ctx.doc().readApiDefinition(element);
}
}
+ private void readTagDefinitions(RoundEnvironment round) {
+ Set extends Element> 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);