1515import org .slf4j .Logger ;
1616import org .slf4j .LoggerFactory ;
1717
18+ import com .fasterxml .jackson .databind .ObjectMapper ;
1819import edu .umd .cs .findbugs .annotations .NonNull ;
1920import edu .umd .cs .findbugs .annotations .Nullable ;
2021import io .jooby .Router ;
2122import io .jooby .SneakyThrows ;
2223import io .jooby .internal .openapi .*;
2324import io .jooby .internal .openapi .javadoc .JavaDocParser ;
2425import io .swagger .v3 .core .util .Json ;
26+ import io .swagger .v3 .core .util .Json31 ;
2527import io .swagger .v3 .core .util .Yaml ;
28+ import io .swagger .v3 .core .util .Yaml31 ;
2629import io .swagger .v3 .oas .models .OpenAPI ;
2730import io .swagger .v3 .oas .models .PathItem ;
2831import io .swagger .v3 .oas .models .Paths ;
32+ import io .swagger .v3 .oas .models .SpecVersion ;
2933import io .swagger .v3 .oas .models .info .Info ;
3034import io .swagger .v3 .oas .models .servers .Server ;
3135import io .swagger .v3 .oas .models .tags .Tag ;
@@ -97,6 +101,8 @@ public String toString(OpenAPIGenerator tool, OpenAPI result) {
97101
98102 private List <Path > sources ;
99103
104+ private SpecVersion specVersion = SpecVersion .V30 ;
105+
100106 /**
101107 * Export an {@link OpenAPI} model to the given format.
102108 *
@@ -149,7 +155,7 @@ public String toString(OpenAPIGenerator tool, OpenAPI result) {
149155
150156 /* Create OpenAPI from template and make sure min required information is present: */
151157 OpenAPIExt openapi =
152- OpenApiTemplate .fromTemplate (basedir , classLoader , templateName ). orElseGet ( OpenAPIExt :: new );
158+ new OpenApiTemplate ( specVersion ) .fromTemplate (basedir , classLoader , templateName );
153159
154160 var mainType = TypeFactory .fromJavaName (classname );
155161 var javadoc = new JavaDocParser (sources );
@@ -175,7 +181,9 @@ public String toString(OpenAPIGenerator tool, OpenAPI result) {
175181 }
176182
177183 RouteParser routes = new RouteParser ();
178- ParserContext ctx = new ParserContext (source , mainType , javadoc , debug );
184+ var json = jsonMapper ();
185+ var yaml = yamlMapper ();
186+ ParserContext ctx = new ParserContext (json , yaml , source , mainType , javadoc , debug );
179187 List <OperationExt > operations = routes .parse (ctx , openapi );
180188
181189 String contextPath = ContextPathParser .parse (ctx );
@@ -241,6 +249,14 @@ public String toString(OpenAPIGenerator tool, OpenAPI result) {
241249 return openapi ;
242250 }
243251
252+ ObjectMapper yamlMapper () {
253+ return specVersion == SpecVersion .V30 ? Yaml .mapper () : Yaml31 .mapper ();
254+ }
255+
256+ ObjectMapper jsonMapper () {
257+ return specVersion == SpecVersion .V30 ? Json .mapper () : Json31 .mapper ();
258+ }
259+
244260 private boolean includes (String value ) {
245261 return pattern (includes , value ).orElse (true );
246262 }
@@ -282,7 +298,7 @@ private void defaults(String classname, String contextPath, OpenAPIExt openapi)
282298 */
283299 public @ NonNull String toYaml (@ NonNull OpenAPI openAPI ) {
284300 try {
285- return Yaml . mapper ().writeValueAsString (openAPI );
301+ return yamlMapper ().writeValueAsString (openAPI );
286302 } catch (IOException x ) {
287303 throw SneakyThrows .propagate (x );
288304 }
@@ -296,7 +312,7 @@ private void defaults(String classname, String contextPath, OpenAPIExt openapi)
296312 */
297313 public @ NonNull String toJson (@ NonNull OpenAPI openAPI ) {
298314 try {
299- return Json . mapper ().writer ().withDefaultPrettyPrinter ().writeValueAsString (openAPI );
315+ return jsonMapper ().writer ().withDefaultPrettyPrinter ().writeValueAsString (openAPI );
300316 } catch (IOException x ) {
301317 throw SneakyThrows .propagate (x );
302318 }
@@ -419,6 +435,10 @@ public void setOutputDir(@NonNull Path outputDir) {
419435 this .outputDir = outputDir ;
420436 }
421437
438+ public void setSpecVersion (SpecVersion specVersion ) {
439+ this .specVersion = specVersion ;
440+ }
441+
422442 private String appname (String classname ) {
423443 String name = classname ;
424444 int i = name .lastIndexOf ('.' );
0 commit comments