@@ -3,7 +3,6 @@ package com.github.swagger.scala.converter
33import java .lang .annotation .Annotation
44import java .lang .reflect .ParameterizedType
55import java .util .Iterator
6-
76import com .fasterxml .jackson .databind .JavaType
87import com .fasterxml .jackson .databind .`type` .ReferenceType
98import com .fasterxml .jackson .module .scala .introspect .{BeanIntrospector , PropertyDescriptor }
@@ -14,6 +13,9 @@ import io.swagger.v3.core.util.{Json, PrimitiveType}
1413import io .swagger .v3 .oas .annotations .Parameter
1514import io .swagger .v3 .oas .annotations .media .{ArraySchema , Schema => SchemaAnnotation }
1615import io .swagger .v3 .oas .models .media .Schema
16+ import org .slf4j .LoggerFactory
17+
18+ import scala .util .control .NonFatal
1719
1820class AnnotatedTypeForOption extends AnnotatedType
1921
@@ -24,6 +26,7 @@ object SwaggerScalaModelConverter {
2426class SwaggerScalaModelConverter extends ModelResolver (SwaggerScalaModelConverter .objectMapper) {
2527 SwaggerScalaModelConverter
2628
29+ private val logger = LoggerFactory .getLogger(classOf [SwaggerScalaModelConverter ])
2730 private val OptionClass = classOf [scala.Option [_]]
2831 private val IterableClass = classOf [scala.collection.Iterable [_]]
2932 private val SetClass = classOf [scala.collection.Set [_]]
@@ -121,15 +124,21 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
121124 case Some (enumAnnotation : JsonScalaEnumeration ) => {
122125 val pt = enumAnnotation.value().getGenericSuperclass.asInstanceOf [ParameterizedType ]
123126 val args = pt.getActualTypeArguments
124- val cls = args(0 ).asInstanceOf [Class [Enumeration ]]
125- getEnumerationInstance(cls).map { enum =>
126- val sp : Schema [String ] = PrimitiveType .STRING .createProperty().asInstanceOf [Schema [String ]]
127- setRequired(`type`)
128- enum .values.iterator.foreach { v =>
129- sp.addEnumItemObject(v.toString)
127+ val cls = args(0 ).asInstanceOf [Class [_]]
128+ val sp : Schema [String ] = PrimitiveType .STRING .createProperty().asInstanceOf [Schema [String ]]
129+ setRequired(`type`)
130+ try {
131+ val valueMethods = cls.getMethods.toSeq.filter { m =>
132+ m.getReturnType.getName == " scala.Enumeration$Value" && m.getParameterCount == 0
133+ }
134+ val enumValues = valueMethods.map(_.getName).filterNot(_ == " Value" )
135+ enumValues.foreach { v =>
136+ sp.addEnumItemObject(v)
130137 }
131- sp
138+ } catch {
139+ case NonFatal (t) => logger.warn(s " Failed to get values for enum ${cls.getName}" , t)
132140 }
141+ Some (sp)
133142 }
134143 case _ => {
135144 Option (nullableClass).flatMap { cls =>
@@ -202,20 +211,6 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
202211 }
203212 }
204213
205- private def getEnumerationInstance (cls : Class [_]): Option [Enumeration ] = {
206- if (cls.getFields.map(_.getName).contains(" MODULE$" )) {
207- val javaUniverse = scala.reflect.runtime.universe
208- val m = javaUniverse.runtimeMirror(Thread .currentThread().getContextClassLoader)
209- val moduleMirror = m.reflectModule(m.staticModule(cls.getName))
210- moduleMirror.instance match
211- {
212- case enumInstance : Enumeration => Some (enumInstance)
213- case _ => None
214- }
215- }
216- else None
217- }
218-
219214 private def getPropertyClass (property : PropertyDescriptor ): Class [_] = {
220215 property.param match {
221216 case Some (constructorParameter) => {
0 commit comments