From 0e76d8304eea5febdcccb720d3cbffa5b52d2dab Mon Sep 17 00:00:00 2001 From: SimY4 Date: Fri, 14 Apr 2023 15:52:58 +1000 Subject: [PATCH] fix 3581: recognize Hidden annotation on enum values. --- .../swagger/v3/core/jackson/ModelResolver.java | 5 +++++ .../swagger/v3/core/util/ReflectionUtils.java | 18 ++++++++++++++++++ .../oas/models/JacksonNumberValueEnum.java | 4 +++- .../models/JacksonNumberValueFieldEnum.java | 4 +++- .../core/oas/models/JacksonPropertyEnum.java | 4 +++- .../v3/core/oas/models/JacksonValueEnum.java | 4 +++- .../core/oas/models/JacksonValueFieldEnum.java | 4 +++- .../oas/models/JacksonValuePrivateEnum.java | 4 +++- 8 files changed, 41 insertions(+), 6 deletions(-) diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java index 8550e83500..bd3140cb2f 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/jackson/ModelResolver.java @@ -1064,6 +1064,11 @@ protected void _addEnumProps(Class propClass, Schema property) { for (Enum en : enumConstants) { String n; + Field enumField = ReflectionUtils.findField(en.name(), enumClass); + if (null != enumField && enumField.isAnnotationPresent(Hidden.class)) { + continue; + } + String enumValue = enumValues[en.ordinal()]; String methodValue = jsonValueMethod.flatMap(m -> ReflectionUtils.safeInvoke(m, en)).map(Object::toString).orElse(null); String fieldValue = jsonValueField.flatMap(f -> ReflectionUtils.safeGet(f, en)).map(Object::toString).orElse(null); diff --git a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReflectionUtils.java b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReflectionUtils.java index 559bc326a2..a1bb422ee9 100644 --- a/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReflectionUtils.java +++ b/modules/swagger-core/src/main/java/io/swagger/v3/core/util/ReflectionUtils.java @@ -160,6 +160,24 @@ public static Method getOverriddenMethod(Method method) { return result; } + /** + * Searches the field name in given class cls. If the field is found returns it, else return null. + * + * @param name is the field to search + * @param cls is the class or interface where to search + * @return field if it is found + */ + public static Field findField(String name, Class cls) { + if (cls == null) { + return null; + } + try { + return cls.getField(name); + } catch (NoSuchFieldException nsfe) { + return null; + } + } + /** * Searches the method methodToFind in given class cls. If the method is found returns it, else return null. * diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonNumberValueEnum.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonNumberValueEnum.java index 9d2f7ba4ea..a5c29b9ff8 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonNumberValueEnum.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonNumberValueEnum.java @@ -1,6 +1,7 @@ package io.swagger.v3.core.oas.models; import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.v3.oas.annotations.Hidden; /** * Enum holds values different from names. Schema model will derive Integer value from jackson annotation JsonValue on public method. @@ -8,7 +9,8 @@ public enum JacksonNumberValueEnum { FIRST(2), SECOND(4), - THIRD(6); + THIRD(6), + @Hidden HIDDEN(-1); private final int value; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonNumberValueFieldEnum.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonNumberValueFieldEnum.java index 5f7a5992e7..6e94628953 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonNumberValueFieldEnum.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonNumberValueFieldEnum.java @@ -1,6 +1,7 @@ package io.swagger.v3.core.oas.models; import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.v3.oas.annotations.Hidden; /** * Enum holds values different from names. Schema model will derive Integer value from jackson annotation JsonValue on private field. @@ -8,7 +9,8 @@ public enum JacksonNumberValueFieldEnum { FIRST(2), SECOND(4), - THIRD(6); + THIRD(6), + @Hidden HIDDEN(-1); @JsonValue private final int value; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonPropertyEnum.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonPropertyEnum.java index 265506f1f8..a13d0b765e 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonPropertyEnum.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonPropertyEnum.java @@ -1,10 +1,12 @@ package io.swagger.v3.core.oas.models; import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.Hidden; public enum JacksonPropertyEnum { @JsonProperty("p1") PRIVATE, @JsonProperty("p2") PUBLIC, SYSTEM, - INVITE_ONLY + INVITE_ONLY, + @Hidden HIDDEN } diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValueEnum.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValueEnum.java index 056524a3c8..329eb32b75 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValueEnum.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValueEnum.java @@ -1,6 +1,7 @@ package io.swagger.v3.core.oas.models; import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.v3.oas.annotations.Hidden; /** * Enum holds values different from names. Schema model will derive String value from jackson annotation JsonValue on public method. @@ -8,7 +9,8 @@ public enum JacksonValueEnum { FIRST("one"), SECOND("two"), - THIRD("three"); + THIRD("three"), + @Hidden HIDDEN("hidden"); private final String value; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValueFieldEnum.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValueFieldEnum.java index a64cb2407d..a96abb2bce 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValueFieldEnum.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValueFieldEnum.java @@ -1,6 +1,7 @@ package io.swagger.v3.core.oas.models; import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.v3.oas.annotations.Hidden; /** * Enum holds values different from names. Schema model will derive String value from jackson annotation JsonValue on private field. @@ -8,7 +9,8 @@ public enum JacksonValueFieldEnum { FIRST("one"), SECOND("two"), - THIRD("three"); + THIRD("three"), + @Hidden HIDDEN("hidden"); @JsonValue private final String value; diff --git a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValuePrivateEnum.java b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValuePrivateEnum.java index 8fc40431d5..ec356efce2 100644 --- a/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValuePrivateEnum.java +++ b/modules/swagger-core/src/test/java/io/swagger/v3/core/oas/models/JacksonValuePrivateEnum.java @@ -1,6 +1,7 @@ package io.swagger.v3.core.oas.models; import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.v3.oas.annotations.Hidden; /** * Enum holds values different from names. Schema model will derive String value from jackson annotation JsonValue on private method. @@ -8,7 +9,8 @@ public enum JacksonValuePrivateEnum { FIRST("one"), SECOND("two"), - THIRD("three"); + THIRD("three"), + @Hidden HIDDEN("hidden"); private final String value;